PHP CSV ayrıştırma için normal ifade

6 Cevap php

I already managed to split the CSV file using this regex: "/,(?=(?:[^\"]\"[^\"]\")(?![^\"]\"))/"

But I ended up with an array of strings that contain the opening and ending double quotes. Now I need a regex that would strip those strings of the delimiter double quotes.

Bildiğim kadarıyla CSV formatında çift tırnak dizeleri kozalayabilirsiniz, zaten dize bir parçası olan tüm çift tırnak ikiye katlanır. Örneğin:

Benim "Diğer" kedi

olur

"Benim" "Diğer" "kedi"

(- Aşağı yuvarlanır N / 2) çift tırnak Ne temelde gerek bir dizi N doublequotes tüm dizileri yerini alacak bir regex olduğunu.

Or is there a better way ? Thanks in advance.

6 Cevap

Okuma csv dosyaları için işlevi vardır: fgetcsv

Neden sizin için tüm zor işleri yapar fgetcsv fonksiyonu varken regex dosyayı bölerek rahatsız mı?

Sen ayırıcı ve sınırlayıcı geçmek ve bunu yapmak için ne algılar.

preg_split('/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/', $line,-1,PREG_SPLIT_DELIM_CAPTURE);

"Toys" R "Us" gibi dizeleri iç "ile ilgili sorunlar var

Yani u kullanmak yerine gerekir:

preg_split('/'.$seperator.'(?=(?:[^\"])*(?![^\"]))/', $line,-1, PREG_SPLIT_DELIM_CAPTURE);

Ben yerine regexes fgetcsv işlevini kullanmanız gerektiğini söyledi başkalarıyla katılıyorum. Bir regex tamam üzerinde iyi-oluşturulmuş CSV veri çalışabilir, fakat CSV biçimlendirilmiş veya bozuk ise, regex sessizce muhtemelen sürecinde sahte sonuçlarını döndürürken, başarısız olur.

Ancak, soru özellikle ilk bölünme sonra istenmeyen tırnak sıyırma hakkında oldu. Önerilen bir çözüm (şimdiye kadar) çok naif olduğunu, ve sadece bir alanın içine kaçtı tırnak değil, gerçek sınırlayıcılarını ilgilenir. (? Ben OP olanlar hakkında sormadım biliyorum, ama onlar kaldırılması gerekiyor, neden diğerleri gibi aynı anda bunları yapmak değil) İşte benim çözüm:

$csv_field = preg_replace('/"(.|$)/', '\1', $csv_field);

Bu regex herhangi bir karakter veya dize sonuna ardından bir tırnak işareti eşleşir ve eşleşen $ ise ikinci karakteri veya boş dize ile birlikte eşleşen karakter (ler) yerini alır. Özelliklerine göre, CSV alanlarını çizgi ayırıcılar içerebilir; bu kadar gerçekleşmesi görünmüyor, ama gerekirse regex için 's' değiştirici ekleyebilirsiniz.

Sadece kelime sınırları üzerinde çalışmak rağmen İşte bu benim çabuk girişimi, bulunuyor.

preg_replace('/([\W]){2}\b/', '\1', $csv)

Yerine fgetcsv bir regex kullanmak için wan't olanlarınız için. Burada bir regex kullanarak CSV bir html tablo oluşturmak için nasıl tam bir örnektir.

    $data = file_get_contents('test.csv');
    $pieces = explode("\n", $data);

    $html .= "<table border='1'>\n";
    foreach (array_filter($pieces) as $line) {

            $html .= "<tr>\n";
            $keywords = preg_split('/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/', $line,-1,PREG_SPLIT_DELIM_CAPTURE);

            foreach ($keywords as $col) {
                    $html .= "<td>".trim($col, '"')."</td>\n";
            }
            $html .= "</tr>\n";
    }
    $html .= "</table>\n";