PHP: HTML tabloları içine düzensiz CSV dosyalarını Biçimlendirme

3 Cevap php

Her satırda elemanlar tutarlı bir düzen ve biçimini takip nerede Müvekkilim, periyodik CSV metin dosyaları bir dizi alır, ama onları ayırmak virgül tutarsız. Bazen bir virgül iki veya dört virgül, vs olacak iki elemanları ve diğer zamanlarda ayrı olacak ...

PHP uygulama ben aşağıdaki şeyleri yapmak için girişimlerini yazıyorum:

PSEUDO-CODE: 
1. Upload csv.txt file from client's local directory.
2. Create new HTML table. 
3. Insert the first three fields FROM csv.txt into HTML table row.
4. Iterate STEP 2 while the FIRST field equals the First field below it.
5. If they do not equal, CLOSE HTML table.
6. Check to see if FIRST field is NOT NULL, IF TRUE, GOTO step 2, Else close HTML table.

Ben adımlarla 1 ile hiçbir sorun yok ve 2. Adım 3 hep virgül aynı sayısına göre ayrılmış değildir csv.txt dosyaları alanlara beri zor alır yerdir. Bunlar her zaman aynı göreli düzen ve biçimde, ancak, bulunmaktadır. Ben de adım 4 ile ilgili sorunlar yaşıyorum. Ben bir satırda başlayan alan altındaki satırda başlangıcı alanı ile eşleşen kontrol etmek nasıl bilmiyorum. Adım 5, nispeten basit olmalıdır. Adım 6 için, ben PHP bir "GOTO" fonksiyonu bir eqivalent bulmalıyız.

Sorusuna herhangi bir bölümü belirsiz olup olmadığını bana bildirin lütfen. Ben yardım için teşekkür ederiz.

Şimdiden teşekkürler!

3 Cevap

Eğer ilk elemanı tarafından grup satırlar isterseniz gibi bir şey deneyebilirsiniz:

  • fgetcsv() yoluyla sonraki satırı okumak
  • Boş filtre elemanları (a, b, c -> a, b, c)
  • satır alanları içeriyorsa <-> boş değil append "kendi" grubu, satır olduğunu

Yani described ettik tam olarak ne değil ama olabilir ne want ;-)

<?php
$fp = fopen('test.csv', 'rb') or die('!fopen');
$groups = array();
while(!feof($fp)) {
  $row = array_filter(fgetcsv($fp));
  if ( !empty($row) ) {
    // @ because I don't care whether the array exists or not
    @$groups[$row[0]][] = $row;
  }
}

foreach( $groups as $g ) {
  echo '
    <table>';
  foreach( $g as $row ) {
    echo '
      <tr>
        <td>', join('</td><td>', array_map('htmlentities', $row)), '</td>
      </tr>
    ';
  }
  echo '</table>';
}

neden sadece herhangi bir tek virgül ile virgül herhangi katları yerine geçerek başlamaz. örneğin:

abc, def, ghi,, jkl

olur:

abc, def, ghi, jkl

ve sonra sadece normal olarak devam.

Her satırda virgül farklı sayılar vardır anlamına sonra bildiğim kadarıyla gördüğünüz gibi yalnız virgül bakarak ne yapmak istediğinizi yapmak aslında mümkün değildir. Örneğin:

ab,c,d,ef // could group columns a-f in that way, but
a,bc,de,f // could also group columns a-f

Eğer diğer bazı talimatlar veya veri türünü verilen sürece ... ve sen, doğru düzenleme olduğu bilmenin bir yolu olurdu başkası gibi düzenli ifadeye göre tanımlanabilir olduğunu söyledi.

Sadece demek, diğer taraftan ise bazen boşluk vardır, ama sütun aynı sayıda bu gibi, hala vardır:

a,b,,d,e,f
a,,c,d,e,f

... Sonra yine doğru tablosunu oluşturabilir. Ben bu durumda (',' $ hattı) patlayabilir kullanarak ve sonra içlerinde ne olduğunu önemsemeden patladı dizinin elemanları üzerinde işlem yapıyor tavsiye ederim.