Zdravím
Měl bych jeden dotaz.
Ukládám si data z formu do CSV, mohu zobrazit i jednotlive soubory ve adresari a otevrit je.
Nyni bych ale potreboval, nacist hodnoty z kazdeho csv (konkrétně z druhého řádku) a ty ukládat do pole.
Jakmile by cyklus došel na konec souboru, každou jednotlivou položku pole vypsat jako nový řádek do noveho csv souboru, který by sloužil jako export.
Tuší někdo, kde bych o tom naleznul nějaké povídání nebo radu?
Děkuji za každou radu...
POZN:
Soubory jsou malé, měl jsem ale zato, že by mělo být možné načíst přímo a jenom druhý řádek a ten uložit jako hodnotu pole (tj. např ze 40 souborů, 40 druhých řádků==>39 indexů v poli) a tyto indexy pak vypsat jako jednotlive radky do noveho souboru.
(jelikož už jsou hodnoty rozděleny středníky při načtení do pole namusím je tak dále rozdělovat)..takže co jedna hodnota pole, to jeden nový řádek výpisu.
Bylo by to možné takto?
Vzpoměl jsem si, že k přečtení určitého řádku slouží fce fgets ale netuším, jak ji ve výsledku použít..
Fórum › PHP
Nacteni obsahu jednotlivych csv do pole a jejich export
To JiriVavru : slouzi pro nacteni jednoho radku...
takze predpokladam neco jako:
$fi = fopen('soubor.csv','r');
fgetscsv($fi); // prvni radek nactu ale nepotrebuju takze nikam neulozim
$pole[] = fgetscsv($fi); // druhy radek - ten chces tak ulozit do nejakyho pole
fclose($fi);
Pravda pravdoucí, opravdu načítá jen řádek, ale když volám samostatnou funkci , háže to fatal error, volání nedefinované fce?
Mám ji tedy přiřadit pod proměnnou?
<?php
$fi = fopen('data.csv','r');
fgetscsv($fi,1000," "); // prvni radek nactu ale nepotrebuju takze nikam neulozim
$pole[] = fgetscsv($fi,1000," "); // druhy radek - ten chces tak ulozit do nejakyho pole
print_r($pole);
fclose($fi);
?>
Děkuji za upozornění, když načítám ze stejného místa, jako je skript, funguje to.
Pokud ovšem načítám z jiné složky, kde je více csv souborů, které procházím
vyhazuje mi to u všech následující error:
Warning: fgetcsv() expects parameter 1 to be resource, boolean given in on line 10
Warning: fopen(..) [function.fopen]: failed to open stream: Permission denied in
Warning: fopen(2008-11-08_20.36.28.csv) [function.fopen]: failed to open stream: No such file or directory in
Nemůže to být způsobeno nastavením přístupu při vytváření souboru?
Kod vypada takto:
<?php
$path = "documents/"; //Assign variable file to CSV documnets
//$export = "export/"; //Assign variable file to EXPORT CSV documnets
$pole = Array(); //Define Array
$file = opendir($path); //Assign variable file to CSV documnets, return descriptor
while ($jmenosouboru = readdir($file)) {
$fi = fopen($jmenosouboru, "r"); //Open file for reading
fgetcsv($fi, 1000, " "); // first row i dont need
$pole = fgetcsv($fi, 1000, " "); // Second row ==> putt into Array
}
$export = fopen("export.csv", "a+"); //Definition for fileopen if file not exist, create new
foreach ($pole as $my_os) {
fwrite($export, "$my_os\r\n");
}
fclose($fi);
fclose($export);
?>
no neni dobry nechavat ty soubory jeste otevreny... zavirej je hned jak nactes ten druhej radek
pak musis osetrit ze to je *.csv protoze read dir vraci jeste . jako aktualni a .. jako nadrazenej adresar
Nadrazeny a ktualni adresar jsem vyresil, ale neni mi moc jasne, kdy bych mel spravne ten handle k souboru uzavrit?
Tusi nekdo?
<?php
$path = "documents/"; //Assign variable file to CSV documnets
//$export = "export/"; //Assign variable file to EXPORT CSV documnets
$pole = array(); //Define Array
$file = opendir($path); //Assign variable file to CSV documnets, return descriptor
while ($jmenosouboru = readdir($file)) {
$fi = fopen($jmenosouboru, "r+"); //Open file for reading
fgetcsv($fi, 1000, " "); // first row i dont need
$pole = fgetcsv($fi, 1000, " "); // Second row ==> putt into Array
if ($file != "." && $file != "..") {
echo "$file\n";
}
}
$export = fopen("export.csv", "a+"); //Definition for fileopen if file not exist, create new
foreach ($pole as $my_os) {
fwrite($export, "$my_os\r\n");
}
fclose($file);
fclose($export);
?>
To JiriVavru : V tom zdrojáku je několik chyb, teda aspoň, co jsem našel já osobně.
1) chybí Ti tam uzavírání jednotlivých souborů
2) kontroluješ $file, zda není "." či "..", i když těchto hodnot nemůže nikdy dosáhnout, protože je to ukazatel
3) místo složky uzavíráš soubor
3) chybí Ti tam, že načtené data ukládáš do pole
4) nekontroluješ ani otevření složky, ani otevření souboru
Osobně bych tento zdroják napsal asi následovně (pokud jsem něco opomenul, tak to prosím ostatní opravte):
<?php
$path = "documents/"; //Assign variable file to CSV documnets
//$export = "export/"; //Assign variable file to EXPORT CSV documnets
$pole = array(); //Define Array
if($file = opendir($path)) { //Assign variable file to CSV documnets, return descriptor
while ($jmenosouboru = readdir($file)) {
if ($jmenosouboru != "." && $jmenosouboru != ".." && is_file($path."/".$jmenosouboru)) {
if($fi = fopen($jmenosouboru, "r+")) { //Open file for reading
fgetcsv($fi, 1000, " "); // first row i dont need
$pole[] = fgetcsv($fi, 1000, " "); // Second row ==> putt into Array
echo "$jmenosouboru\n";
fclose($fi);
}
}
}
closedir($file);
if($export = fopen("export.csv", "a+")) { //Definition for fileopen if file not exist, create new
foreach ($pole as $my_os) {
fwrite($export, "$my_os\r\n");
}
fclose($export);
}
} else {
echo "Během otevření složky došlo k chybě!\n";
}
?>
Tak jsem zjistil, že jsem měl chybu v definici cety k načteným csv, myslel jsem, že cestu vrátí deskripor u opendir, ale ne.
Tak jsem to upravil, fuguje to ale...
Problém bude asi v poli, jelikož do exportu se zaznamená pouze jeden řádek..nevím ale, kdy by mohla býti chyba...
Tušil by někdo prosím?
S databází by jseem toto nezažil:)
To KIIV : Jestli používá ten zdroják, který zde uvedl, tak mu stejně žádné pole nevypíše, protože ukládá řádek do proměnné:
$pole = fgetcsv($fi, 1000, " "); // Second row ==> putt into Array
Čímž změní pole na proměnnou. Proto mu to vypisuje jen jeden řádek.
To KIIV : heh, to je tím pozdním časem :smile6:
Takže co tam mám špatně?
Když zapíši
$pole[] = fgetcsv($fi, 1000, " "); // Second row ==> putt into Array
a dám fcí print_r($pole);
Vypíše se mi pole správně(rsp. správné hodnoty).
Když ale zapíši do souboru vypíše se mi vždy jenom slovo array, tolirát, kolik je souborů k procházení..
To JiriVavru : protoze tam mas pole ale v tom poli je kazdej radek reprezentovan jako dalsi pole...
bud pouzijes nejaky fputcsv
nebo musis vyuzit funkci jako implode ci alias join
To KIIV : takže to pole vypadá třeba následovně?
pole=array (array(1, 2, 3, 4), array(5,6,7,8),array(10,11,12,13));
To JiriVavru : Tady je upravený zdroják, ten by měl už vypsat celé řádky.
<?php
$path = "documents/"; //Assign variable file to CSV documnets
//$export = "export/"; //Assign variable file to EXPORT CSV documnets
$pole = array(); //Define Array
if($file = opendir($path)) { //Assign variable file to CSV documnets, return descriptor
while ($jmenosouboru = readdir($file)) {
if ($jmenosouboru != "." && $jmenosouboru != ".." && is_file($path."/".$jmenosouboru)) {
if($fi = fopen($jmenosouboru, "r+")) { //Open file for reading
fgetcsv($fi, 1000, " "); // first row i dont need
$pole[] = fgetcsv($fi, 1000, " "); // Second row ==> putt into Array
echo "$jmenosouboru\n";
fclose($fi);
}
}
}
closedir($file);
if($export = fopen("export.csv", "a+")) { //Definition for fileopen if file not exist, create new
foreach ($pole as $my_os) {
$textik=implode(",", $my_os);
fwrite($export, "$textik\r\n");
}
fclose($export);
}
} else {
echo "Během otevření složky došlo k chybě!\n";
}
?>
To DragonBehemont : jojo ... nacita data pomoci fgetcsv.. to nacte radek a jednotlive polozky nacte rovnou do pole... nemusis pak na to pouzivat explode resp split
ma pak pole radku a kazdy radek je pole polozek
ale ty radky by se pak daly zapisovat klidne tim fputcsv nebo jak se to menuje... to zase pole zapise jako radek csv
EDIT: kdyz nad tim premejslim tak nemusi ani nacitat pomoci ty fgetcsv .. . s tim csv nijak nepracuje tak muze rovnou nacist jen radek :smile16: a pak ten radek tak jak je ulozit
To KIIV : Jj, už jsem to našel
http://us3.php.net/manual/en/function.fputcsv.php
, zajímavá funkce a tím pádem by tam ani nemusel dávat to implode.To KIIV : Otázka je, který postup bude rychlejší... jestli to nejdříve načíst do pole a nebo rovnou ukládat. Nebude mu to více zatěžovat server, když bude mít najednou otevřené dva soubory? Nevím, nikdy jsem to takhle výkonostně neporovnával.
Tak, funguje to nyní, tak jak skutečně má, bylo jen třeba upravit cestu na:
if($fi = fopen($path.$jmenosouboru, "r+")) { //Open file for reading
Děkuji vám moc za rady, jinak bych se tu s takovou drobností mořil kdovíjak dlouho.
Snad to v budoucnu pomůže i někomu dalšímu..
Ještě jednou dík..
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Načtení obsahu souboru do pole — založil Nazghul
Export data z csv to csv — založil Jozef
Export dat z csv do xml pouzitim php — založil JM
Export/import dat do *.csv, odkazování na mapy — založil MichalK
Export dat z db do CSV - bez FILE privileg. — založil ololol
Moderátoři diskuze