PHP CSV dosyalarını okuma sorunu

5 Cevap php

Ben metin olarak bir web sayfası üzerinde çıkışına kadar a.csv dosyadan veri okumaya çalışıyorum.

Ben yapıyorum ilk kez ve ben kötü bir küçük sorun haline çalıştırmak.

Benim. Csv dosyası (varsayılan olarak, Excel tarafından openened olur), birden fazla satır var ve ben uzun bir dize olarak tüm şey okudum.

gibi bu:

$contents = file_get_contents("files/data.csv");

Ben yapılan bu örnek dosyada, 2 hatları vardır.

Paul Blueberryroad 85 us Flashlight,Bag November 20, 2008, 4:39 pm

Hellen Blueberryroad 85 us lens13mm,Flashlight,Bag,ExtraBatteries November 20, 2008, 16:41:32

Ama PHP tarafından okunan dize şudur:

Paul, Blueberryroad 85, bize, el feneri, Çanta, 20 Kasım 2008, 04:39 pmHellen; Blueberryroad 85, us; lens13mm, El feneri, Çanta, ExtraBatteries, 20 Kasım 2008, 16:41:32

Ben bu bölme ediyorum:

list($name[], $street[], $country[], $accessories[], $orderdate[]) = split(";",$contents);

Ne istiyorum $ isim [] içeriği olarak "Paul" ve "Hellen" içeren içindir. Ve diğer diziler kendi sütun değerlerini almak için.

Bunun yerine Paul ve $ orderdate [] içeriği yalnızca olsun

20 Kasım 2008, 04:39 pmHellen

Böylece tüm satırlar birleştirilir. Birisi i ne gerek elde edebilirsiniz nasıl bana gösterebilir misin?

EDIT: çözüm bulunamazsa, geriye kalan tek şey werid:

Ben bu kod parçası kullanarak şimdi çözdük:

$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
  $contents[] = fgetcsv($fo,0,';');
}
fclose($fo);

Benim CSV dosyası sadece 2 satır vardır allthough Nedense, bu 2 dizi ve 1 boolean döndürür. İlk 2 benim veri dizileri ve mantıksal 0 olduğunu.

5 Cevap

CSV dosya yapısı farkındadır ve CSV dosyalarını yönetmek için seçenekleri belirlenmiştir fgetcsv() hangi kullanarak daha iyi. Alternatif olarak, str_getcsv() dosyasının içeriği yerine kullanabilirsiniz.

file() işlevi bir diziden bir dosyayı okur, her satır dizinin bir giriştir.

Böylece gibi bir şey yapabilirsiniz:

$rows = array();
$name = array();
$street = array();
$country = array();

$rows = file("file.csv");
foreach($rows as $r) {
    $data = explode(";", $r);
    $name[] = $data[0];
    $street[] = $data[1];
    $country[] = $data[2];
}

Ben bu kod parçası kullanarak şimdi çözdük:

$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
  $contents[] = fgetcsv($fo,0,';');
}
fclose($fo);

Benim CSV dosyası sadece 2 satır vardır allthough Nedense, bu 2 dizi ve 1 boolean döndürür. İlk 2 benim veri dizileri ve mantıksal 0 olduğunu.

Fgetcsv hakkında açıklama doğrudur.

I will still answer your question, for educational purpose. First thing, I don't understand the difference between your data (with comas) and the "string read by PHP" (it substitutes some spaces with semi-colon, but not all?). PS.: I looked at the source code of your message, it looks like an odd mix of TSV (tabs) and CSV (coma).

Bu şekilde gitmek istiyorsanız yanında, sen alanlarında çizgiler, sonra hatlarında ilk dosyayı bölmek gerekir.

Belirttiği gibi en iyi yolu () ders fgetcsv biridir.

$f = fopen ('test.csv', 'r');
while (false !== $data = fgetcsv($f, 0, ';'))
    $arr[] = $data;
fclose($f);

Eğer bir değişken içeriği var ve bunu bölmek istiyorum, ve str_getcsv kullanılamaz Ama eğer bu kullanabilirsiniz:

function str_split_csv($text, $seperator = ';') {
    $regex = '#' . preg_quote($seperator) . '|\v#';
    preg_match('|^.*$|m', $text, $firstline);
    $chunks = substr_count($firstline[0], $seperator) + 1;
    $split = array_chunk(preg_split($regex, $text), $chunks);
    $c = count($split) - 1;
    if (isset($split[$c]) && ((count($split[$c]) < $chunks) || (($chunks == 1) && ($split[$c][0] == ''))))
        unset($split[$c]);
    return $split;
}