2017-11-06 15 views
3

一部のCSVファイルに問題があります。私はPHPでファイルを読んでいます不正な引用CSVファイルの正規表現

column1 | column2 | column3       | column4 | column5 | column6 
123  | some text | "column3 text, still column3 text" | 4  | 234  | 
123  | some text | "column3 text"      | 4  | 234  | 

をし、配列にstr_getcsvでそれを使用しようとしました:それはそのようになっているはずの表で

column1,column2,column3,column4,column5,column6 
123,"some text",""column3 text"",""still column3 text"",4,234,"" 
123,"some text",""column3 text"",4,234,"" 

:私はそのようにそれを得ます。しかし、この壊れた引用符のために、それは動作しませんし、常にタイトルよりも多くの列を持っています。

私は3列目の値を必要としないので、3つのグループを作成してpreg_replaceを実行する正規表現を実行しようとしました。しかし、私は両方のラインで動作する正規表現を取得しません。この正規表現で

私はちょうど最初の行を取得:https://regex101.com/r/OjTAAC/1

、これで私はちょうど二行目を取得:https://regex101.com/r/I2xqPs/1

誰もが両方の状況のた​​めに働く正規表現を取得するにはどのようにいくつかの助けを持っていますか?

+0

他のいくつかの方法があるに違いありません、[この正規表現](https://regex101.com/r/ngiijv/1は)あまりにも面倒なようです。 –

+0

最後に空 ""があると問題が起きる – Eumel

+0

行を分割し、大文字と小文字を区別することができます。 – Eumel

答えて

1

もっと簡単な解決策があるかもしれませんが、私はバックアップを取ったり、ファイルのコピーを持っているかもしれません。

は限り行はあなたはそれが動作するはず示しものと一致しているよう

//$str = '123,"some text",""column3 text"",""still column3 text"",4,234,""'; 
//$str = '123,"some text",""column3 text"",4,234,""' 

while (($str = fgets($handle, 4096)) !== false) {  
    $str = str_replace('"', '', $str); 
    $line = explode(',',$str); 

    //combine line item 2,3 
    if(count($line) == 7){ 
     $line[2] .= ', '.$line[3]; 
     //remove item 3 
     unset($line[3]); 
     $line = array_values($line); 
    } 
    print_r($line); 
} 

別の何かを試すことができます。

$array =[ 
    '123,"some text",""column3 text"",""still column3 text"",4,234,""', 
    '123,"some text",""column3 text"",4,234,""' 
]; 

foreach($array as $str){ 
    $str = str_replace('"', '', $str); 
    $line = explode(',',$str); 

    //combine line item 2,3 
    if(count($line) == 7){ 
     $line[2] .= ', '.$line[3]; 
     //remove item 3 
     unset($line[3]); 
     $line = array_values($line); 
    } 
    print_r($line); 
} 

出力

Array 
(
    [0] => 123 
    [1] => some text 
    [2] => column3 text, still column3 text 
    [3] => 4 
    [4] => 234 
    [5] => 
) 
Array 
(
    [0] => 123 
    [1] => some text 
    [2] => column3 text 
    [3] => 4 
    [4] => 234 
    [5] => 
) 

あなたはここでそれをテストすることができます。

http://sandbox.onlinephpfunctions.com/code/f39eb94ccef045213a30385cc7daa326ce3aa25d

+0

お返事ありがとうございます。しかし、私の問題は、行末にはありません。それはCSVファイルで完全に壊れているColumn3の値です。 –

+0

私の答えでは、行末の '' ''は完全に有効です。有効な二重引用符 '' "がない限り、最後のものは有効な二重引用符の例です。 – ArtisticPhoenix

+0

ええ、それは実用的な解決策になります。 ""私はまだ持っていなかったすべてのものを置き換えるという考え。私の回避策は、現時点ではこのように見えます。http://sandbox.onlinephpfunctions.com/code/8e6c63130111cda0018aaf545fd021397fe4e80c –