CSV dosyasından aynı hücre içinde birden fazla satır al

CSV dosyasından bazı verileri almaya çalışıyorum. CSV’yi geçmek için aşağıdaki kodu kullandım:

//create array for csv file
$array_data = array();
$row = 0;
if (($handle = fopen("import/pdf_data.csv", "r")) !== FALSE) {
   //read the CSV from root folder "web/interval/import"
    while (($data = fgetcsv($handle, 0, ";")) !== FALSE) {
        if ($row > 0) {
            $array_data[$row] = $data;
        }
        $row++;
    }
    fclose($handle);
}

//loop through all the feature data array
foreach ($array_data as $entry_value => $array_column) {
    foreach( $array_column as $value )
    {       
       //split data
       list($col1,$col2,$col3) = explode( ',', $value );

       echo "Name: ".$col1.", Surname: ".$col2.", Text: ".$col3."
";

Sütunları yazdırdığımda ... col1 ve col2 hücrelerinde yalnızca tek bir değer bulunduğundan gayet iyi. col3 birden fazla satır içerebilir. Diyelim ki örneğin (bir col3 hücresinin altına bakınız):

col3
::::::::::::::
Text-a in line 1
Text-a in line 2
Text-a in line 3

Bir hücrede birden fazla satır varsa, CSV çıktısı şöyle olacaktır: "Satır 1-Metin-a Satır 2-Metin-a Satır 3"

ve yukarıda kullandığım kodla ilk satırı yazdırıyor "1. satırdaki metin a sonra yeni girişte ikinci satır vb.

Ulaşmak istediğim şey şu format.

echo "Name: ".$col1.", Surname: ".$col2.", Text: ".$col3."
";

Bunu aldığımda birden fazla satır ile çalışmaz:

  • Ad: Test, Soyadı: Test2, Metin: "Satır 1'deki metin-a
  • Ad:, Soyadı:, Metin: 2. satırdaki Metin-a

Herhangi bir öneriniz çok takdir edilecektir, teşekkür ederim

1
Bize burada göstermediğiniz bir sürü tanımsız değişken ve kodunuz var!
katma yazar Rizier123, kaynak
Bize burada göstermediğiniz bir sürü tanımsız değişken ve kodunuz var!
katma yazar Rizier123, kaynak
Evet, lütfen tam bir CSV içeriği satırı, bellekten fgetcsv alıntı bir hücrede oldukları sürece yeni satırlarla başa çıkmalı
katma yazar dsas, kaynak
Evet, lütfen tam bir CSV içeriği satırı, bellekten fgetcsv alıntı bir hücrede oldukları sürece yeni satırlarla başa çıkmalı
katma yazar dsas, kaynak
tam olarak ne göstermemi istiyorsun? csv içeriği?
katma yazar shieldcy, kaynak
tam olarak ne göstermemi istiyorsun? csv içeriği?
katma yazar shieldcy, kaynak
Tamam, sadece içeriği yükledim :) kontrol kimliği: örneğin 91 veya 58. Satır sonunun bilgiyi null kimliği olan yeni bir satıra taşıdığını görebilirsiniz. Aynı sırada olmalılar. Str_replace kullanmayı ve/n veya/r'yi boşlukla değiştirmeye çalıştım ama yine de şansım yok
katma yazar shieldcy, kaynak
Excel'de metin 1, sonra yeni satır ve metin2'dir. CSV'ye dönüştürdüğümde ve notepad ile açtığımda, "text1text2" gibi boşluksuz tırnak işaretleri var. Gördüğüm ekran görüntüsünü PHP'de nasıl göründüğünü yazıyorum.
katma yazar shieldcy, kaynak
Excel'de metin 1, sonra yeni satır ve metin2'dir. CSV'ye dönüştürdüğümde ve notepad ile açtığımda, "text1text2" gibi boşluksuz tırnak işaretleri var. Gördüğüm ekran görüntüsünü PHP'de nasıl göründüğünü yazıyorum.
katma yazar shieldcy, kaynak
Excel'de metin 1, sonra yeni satır ve metin2'dir. CSV'ye dönüştürdüğümde ve notepad ile açtığımda, "text1text2" gibi boşluksuz tırnak işaretleri var. Gördüğüm ekran görüntüsünü PHP'de nasıl göründüğünü yazıyorum.
katma yazar shieldcy, kaynak
Tamam, sadece içeriği yükledim :) kontrol kimliği: örneğin 91 veya 58. Satır sonunun bilgiyi null kimliği olan yeni bir satıra taşıdığını görebilirsiniz. Aynı sırada olmalılar. Str_replace kullanmayı ve/n veya/r'yi boşlukla değiştirmeye çalıştım ama yine de şansım yok
katma yazar shieldcy, kaynak

6 cevap

Bir CSV dosyası, bir hücrede çok satırlı bir değer içerebilir. Ancak, tırnak içine alınması gerekir. Excel bunu doğru yapar - bir test dosyası oluşturun ve CSV'ye kaydedin. PHP işlevi fgetcsv da böyle dosyaları doğru okuyabilir.

Örnek dosya:

"col1","col2","col3"
"test1","test2.1
test2.2
test2.3","test3"

İkinci satırdaki ikinci sütun çok satırlı bir değer içerir ve bu tamamen geçerli bir CSV dosyasıdır.


İşte doğru kod:

$array_data = array();
$row = 0;
if (($handle = fopen("import/pdf_data.csv", "r")) !== FALSE) {
   //read the CSV from root folder "web/interval/import"
    while (($data = fgetcsv($handle, 0, ",")) !== FALSE) {
        if ($row > 0) {
            $array_data[$row] = $data;
        }
        $row++;
    }
    fclose($handle);
}

//loop through all the feature data array
foreach ($array_data as $row) {
   list($col1,$col2,$col3) = $row;

   echo "Name: ".$col1.", Surname: ".$col2.", Text: ".$col3."
"; }
1
katma
Bu, tuhaf CSV formatı kullanan Excel ile ilgili olabilir (aslında yerel ayarlara bağlıdır). Alan ayırıcı olarak noktalı virgül belirttiğinizi fark ettim ve bu Excel'in tırnak işaretleri olmadan kaydettiğinin bir işareti. Dosyayı CSV'ye kaydedebilir ve daha sonra not defterinde açabilirsiniz. Tırnak var mı? Lütfen sorunuza gönderin.
katma yazar astax, kaynak
Sanırım neyin yanlış olduğunu anladım. CSV dosyanız aslında virgül kullanıyor, ancak noktalı virgül belirtdiniz. Yani fgetcsv, CSV biçimini ayrıştırmak yerine dosyadan yalnızca bir satır okur. Bu yüzden daha sonra patlamak() zorundaydınız. Sınırlayıcı olarak virgül kullanmak ve patlatmayı kaldırmak için fgetcsv çağrısını değiştirin
katma yazar astax, kaynak
Bence çözümü buldun. Şimdi bu harika bir iş gibi görünüyor! Beni çok saat aldı. Yardım için teşekkürler
katma yazar shieldcy, kaynak
evet, CSV'de olması gerektiği gibi gösterir. tırnak ve ayırıcı olarak virgül ile. Şimdi sadece bu kesme çizgilerini kaldırmak için bir yol bulmaya çalışıyorum ve column3'ü bir satırda kalan sütunlarla al
katma yazar shieldcy, kaynak
Evet doğru. CSV'de alıntılar vb. İle tamam gözüküyor. Ancak yankı duyduğumda ekran görüntüsünden yeni bir satıra geçtiğini görebiliyorsunuz. İlk metni içeren bir alıntıyı yazdırır, ardından ikinci metni içeren ikinci satıra gider. Veya veriyi DB'ye eklemeye çalıştım. Yine, bir alan yerine yeni bir satıra gider.
katma yazar shieldcy, kaynak

Bir CSV dosyası, bir hücrede çok satırlı bir değer içerebilir. Ancak, tırnak içine alınması gerekir. Excel bunu doğru yapar - bir test dosyası oluşturun ve CSV'ye kaydedin. PHP işlevi fgetcsv da böyle dosyaları doğru okuyabilir.

Örnek dosya:

"col1","col2","col3"
"test1","test2.1
test2.2
test2.3","test3"

İkinci satırdaki ikinci sütun çok satırlı bir değer içerir ve bu tamamen geçerli bir CSV dosyasıdır.


İşte doğru kod:

$array_data = array();
$row = 0;
if (($handle = fopen("import/pdf_data.csv", "r")) !== FALSE) {
   //read the CSV from root folder "web/interval/import"
    while (($data = fgetcsv($handle, 0, ",")) !== FALSE) {
        if ($row > 0) {
            $array_data[$row] = $data;
        }
        $row++;
    }
    fclose($handle);
}

//loop through all the feature data array
foreach ($array_data as $row) {
   list($col1,$col2,$col3) = $row;

   echo "Name: ".$col1.", Surname: ".$col2.", Text: ".$col3."
"; }
1
katma
Bu, tuhaf CSV formatı kullanan Excel ile ilgili olabilir (aslında yerel ayarlara bağlıdır). Alan ayırıcı olarak noktalı virgül belirttiğinizi fark ettim ve bu Excel'in tırnak işaretleri olmadan kaydettiğinin bir işareti. Dosyayı CSV'ye kaydedebilir ve daha sonra not defterinde açabilirsiniz. Tırnak var mı? Lütfen sorunuza gönderin.
katma yazar astax, kaynak
Sanırım neyin yanlış olduğunu anladım. CSV dosyanız aslında virgül kullanıyor, ancak noktalı virgül belirtdiniz. Yani fgetcsv, CSV biçimini ayrıştırmak yerine dosyadan yalnızca bir satır okur. Bu yüzden daha sonra patlamak() zorundaydınız. Sınırlayıcı olarak virgül kullanmak ve patlatmayı kaldırmak için fgetcsv çağrısını değiştirin
katma yazar astax, kaynak
Bence çözümü buldun. Şimdi bu harika bir iş gibi görünüyor! Beni çok saat aldı. Yardım için teşekkürler
katma yazar shieldcy, kaynak
evet, CSV'de olması gerektiği gibi gösterir. tırnak ve ayırıcı olarak virgül ile. Şimdi sadece bu kesme çizgilerini kaldırmak için bir yol bulmaya çalışıyorum ve column3'ü bir satırda kalan sütunlarla al
katma yazar shieldcy, kaynak
Evet doğru. CSV'de alıntılar vb. İle tamam gözüküyor. Ancak yankı duyduğumda ekran görüntüsünden yeni bir satıra geçtiğini görebiliyorsunuz. İlk metni içeren bir alıntıyı yazdırır, ardından ikinci metni içeren ikinci satıra gider. Veya veriyi DB'ye eklemeye çalıştım. Yine, bir alan yerine yeni bir satıra gider.
katma yazar shieldcy, kaynak

Bir CSV dosyası, bir hücrede çok satırlı bir değer içerebilir. Ancak, tırnak içine alınması gerekir. Excel bunu doğru yapar - bir test dosyası oluşturun ve CSV'ye kaydedin. PHP işlevi fgetcsv da böyle dosyaları doğru okuyabilir.

Örnek dosya:

"col1","col2","col3"
"test1","test2.1
test2.2
test2.3","test3"

İkinci satırdaki ikinci sütun çok satırlı bir değer içerir ve bu tamamen geçerli bir CSV dosyasıdır.


İşte doğru kod:

$array_data = array();
$row = 0;
if (($handle = fopen("import/pdf_data.csv", "r")) !== FALSE) {
   //read the CSV from root folder "web/interval/import"
    while (($data = fgetcsv($handle, 0, ",")) !== FALSE) {
        if ($row > 0) {
            $array_data[$row] = $data;
        }
        $row++;
    }
    fclose($handle);
}

//loop through all the feature data array
foreach ($array_data as $row) {
   list($col1,$col2,$col3) = $row;

   echo "Name: ".$col1.", Surname: ".$col2.", Text: ".$col3."
"; }
1
katma
Bu, tuhaf CSV formatı kullanan Excel ile ilgili olabilir (aslında yerel ayarlara bağlıdır). Alan ayırıcı olarak noktalı virgül belirttiğinizi fark ettim ve bu Excel'in tırnak işaretleri olmadan kaydettiğinin bir işareti. Dosyayı CSV'ye kaydedebilir ve daha sonra not defterinde açabilirsiniz. Tırnak var mı? Lütfen sorunuza gönderin.
katma yazar astax, kaynak
Sanırım neyin yanlış olduğunu anladım. CSV dosyanız aslında virgül kullanıyor, ancak noktalı virgül belirtdiniz. Yani fgetcsv, CSV biçimini ayrıştırmak yerine dosyadan yalnızca bir satır okur. Bu yüzden daha sonra patlamak() zorundaydınız. Sınırlayıcı olarak virgül kullanmak ve patlatmayı kaldırmak için fgetcsv çağrısını değiştirin
katma yazar astax, kaynak
evet, CSV'de olması gerektiği gibi gösterir. tırnak ve ayırıcı olarak virgül ile. Şimdi sadece bu kesme çizgilerini kaldırmak için bir yol bulmaya çalışıyorum ve column3'ü bir satırda kalan sütunlarla al
katma yazar shieldcy, kaynak
Bence çözümü buldun. Şimdi bu harika bir iş gibi görünüyor! Beni çok saat aldı. Yardım için teşekkürler
katma yazar shieldcy, kaynak
Evet doğru. CSV'de alıntılar vb. İle tamam gözüküyor. Ancak yankı duyduğumda ekran görüntüsünden yeni bir satıra geçtiğini görebiliyorsunuz. İlk metni içeren bir alıntıyı yazdırır, ardından ikinci metni içeren ikinci satıra gider. Veya veriyi DB'ye eklemeye çalıştım. Yine, bir alan yerine yeni bir satıra gider.
katma yazar shieldcy, kaynak

I could advice you by another simple solution. It is using fgets() and explode()

$handle = fopen("inputfile.txt", "r");
$out = array();
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        $arr = explode(',' $line);
        $out[] = trim($arr[2]);//Supposing you want to get the third cell.
    }

    fclose($handle);
} else {
   //error opening the file.
}
print_r($out); 

Reference: How to read a file line by line in php

0
katma
patlayabilir olan tek sorun dizgenin sınırlayıcıyı içerdiği zaman ortaya çıkar. yani, ,
katma yazar SaidbakR, kaynak
Explode() 'ı kullanmak soruna neden olan tam olarak budur, bundan kaçınılmalıdır. Alıntılanan ve çok satırlı dizeleri doğru işlemez.
katma yazar astax, kaynak

I could advice you by another simple solution. It is using fgets() and explode()

$handle = fopen("inputfile.txt", "r");
$out = array();
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        $arr = explode(',' $line);
        $out[] = trim($arr[2]);//Supposing you want to get the third cell.
    }

    fclose($handle);
} else {
   //error opening the file.
}
print_r($out); 

Reference: How to read a file line by line in php

0
katma
patlayabilir olan tek sorun dizgenin sınırlayıcıyı içerdiği zaman ortaya çıkar. yani, ,
katma yazar SaidbakR, kaynak
Explode() 'ı kullanmak soruna neden olan tam olarak budur, bundan kaçınılmalıdır. Alıntılanan ve çok satırlı dizeleri doğru işlemez.
katma yazar astax, kaynak

I could advice you by another simple solution. It is using fgets() and explode()

$handle = fopen("inputfile.txt", "r");
$out = array();
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        $arr = explode(',' $line);
        $out[] = trim($arr[2]);//Supposing you want to get the third cell.
    }

    fclose($handle);
} else {
   //error opening the file.
}
print_r($out); 

Reference: How to read a file line by line in php

0
katma
patlayabilir olan tek sorun dizgenin sınırlayıcıyı içerdiği zaman ortaya çıkar. yani, ,
katma yazar SaidbakR, kaynak
Explode() 'ı kullanmak soruna neden olan tam olarak budur, bundan kaçınılmalıdır. Alıntılanan ve çok satırlı dizeleri doğru işlemez.
katma yazar astax, kaynak