2011-06-30 22 views
16

私はphpのSOAP呼び出しからCSVデータを取得します。残念ながら、データにカンマが含まれている可能性があります。それは、私はPHPやJavaScriptのいずれかで個々の値にそれを解析する必要があります...、CSVでカンマを扱う

を、

1のように正しくフォーマット名、2、ラリアット、3、 "最初、最後の"、5、NMEAされます。私はスタックオーバーフローや他の場所でスレッドを参照しているが、PHP/javascriptで特定の解決策が見つかりませんでした。

私が現在使用しているアプローチは

* *はdeliminatorですが、 preg_replaceが余分に発生
$subject = '123,name,456,lryyrt,123213,"first,last",8585,namea3'; 
$pattern = '/,|,"/'; 
$t2=preg_replace ('/,|(".*")/','$0*',$subject); 
$t2=str_replace(',','*',$t2); 
$t2=str_replace('*',',',$t2); 

です。私はpreg_matchとその他のpreg_関数を含むいくつかのアプローチを試みましたが、何らかのクリーンな分割を行うことに成功しませんでした。

コンマが含まれているCSVデータを分割する方法についてのご意見はありますか?

答えて

30

これを正規表現では行わないでください。ちょうどstr_getcsv()を使用してください! 3番目のパラメータは、引用符で囲まれたフィールドを検索するようにstr_getcsv()に通知します。

$subject = '123,name,456,lryyrt,123213,"first,last",8585,namea3'; 
$array = str_getcsv($subject, ",", '"'); 

print_r($array); 
// Prints: 
Array 
(
    [0] => 123 
    [1] => name 
    [2] => 456 
    [3] => lryyrt 
    [4] => 123213 
    [5] => first,last 
    [6] => 8585 
    [7] => namea3 
) 
+3

str_getcsvは、PHP 5.3以降では使用できません。その前にfgetcsvが使われました。ファイルやその他のストリームから直接コンテンツを取得していない場合は、そのストリームをストリーム(php://メモリ、書き込み後に位置リセット)またはファイルに強制しなければならない場合があります。 – Zimzat

2

csvファイルを連想配列に変換する別の方法です。 JavaScriptが

<?php 
// 
// Convert csv file to associative array: 
// 

function csv_to_array($input, $delimiter=',') 
{ 
    $header = null; 
    $data = array(); 
    $csvData = str_getcsv($input, "\n"); 

    foreach($csvData as $csvLine){ 
     if(is_null($header)) $header = explode($delimiter, $csvLine); 
     else{ 

      $items = explode($delimiter, $csvLine); 

      for($n = 0, $m = count($header); $n < $m; $n++){ 
       $prepareData[$header[$n]] = $items[$n]; 
      } 

      $data[] = $prepareData; 
     } 
    } 

    return $data; 
} 

//----------------------------------- 
// 
//Usage: 

$csvArr = csv_to_array(file_get_contents('test.csv')); 

?> 
+0

@Phoenix - このデータと引用のコンマを扱う部分は何ですか?何か不足していますか? –

0

すでにだけ拡張メソッドを公開するためにjqueryの-csv.jsモジュールを追加し、jQueryのを使用している場合jQuery-CSV

を使用しています。次に、CSVをJavaScript配列に直接変換します。

だけ、次の構文解析している場合は1次元配列に変換します:あなたは複数行CSV文字列を持っている場合は、以下の二に変換します

$.csv.toArray(csv); 

次元配列:

$.csv.toArrays(csv); 

注:すべての異なる行末が検出され、正しくスマート正規表現を使用して分割されています。

デフォルトの区切り文字は、二重引用符( ")と、デフォルトの区切りはカンマ(、)ですが、メソッドの呼び出しでそれらを指定することにより、利用カスタム設定を変更することができます

例:

$ .csv.toArray(CSV、{ セパレータ: ';'、 デリミタ: """ });

IはJavaScriptで書かれたエンドツーエンドのCSVパーサを提供するプロジェクトを作成それはguesswoを取る輸入/輸出CSVからのrk。

クライアントで重労働を実行すると、サーバーへの不必要な負荷がなくなり、サーバーへの不要なAJAXラウンドトリップが削除されます。

更新:

あなたは、サーバー側のソリューションを探しているなら、ライブラリはまたNode.js.上で動作します

+0

ありがとうございます。私はクライアント側のcsv処理のためにこれを選択すると思うが、私のアプリケーションはサーバー側に基づいていたので、csv出力を与えた非リレーショナルデータベースを照会しなければならなかった。 –

+0

すみません。私は質問を忘れてしまったと思う:-(ほぼ1年前に投稿していたプロジェクトが閉じられている)jQueryの代替案を指摘していただきありがとうございます。もう一度:-) –

+0

@LordLoh。サーバー側のソリューションが必要な場合は、プラグインがNode.jsでも動作することを確認したところです。 Node.jsスクリプトにインポートする方法の詳細は、プロジェクトページにあります。 –