2009-09-03 31 views

答えて

32

PHP 5.3からは、str_getcsv()を使用して、異なる区切り文字を使用して行を読み取ることができます。

$someCondition = someConditionToDetermineTabOrComma(); 

$delimiter = $someCondition ? "," : "\t"; 

$fp = fopen('mydata.csv', 'r'); 

while (!feof($fp)) 
{ 
    $line = fgets($fp, 2048); 

    $data = str_getcsv($line, $delimiter); 

    doSomethingWithData($data); 
}        

fclose($fp); 
+0

私は似たような解決策になった。私はファイルを読んで、その中のタブを検索する。もし見つからなければ、デリミタはコンマであると仮定します。次に、getscvをPHPのバージョンが5.2であるとして使用します。私はこれにいくつかの欠陥を見ていますが、私は何か良いことは考えられません。 – veli

+0

おそらく、最初の行でタブとコンマ(および他の可能性のある区切り文字)を数え、2番目の行と比較するなどです。どちらが最も一貫しているかは、可能性の高い区切り文字です。残念ながら、2つのパスの解決方法がありますが、それはあなたがそのような不明な点を持つときの方法です。 – Rikki

0

ファイル全体を1行ずつ読み込み、分割して分割します。

任意の区切り文字を含む正規表現を含めることができます。私は文をテストするためにここにPHPはありませんでしたが、split()のphp.net - >検索。 また正規表現に関するコメントもあります。

+0

しかし、その方法は、おそらくCSVファイルのすべてが、最も簡単なの目的を破り、getcsvのエンクロージャの機能を排除するであろう。 – dimo414

0

あなたはあなたがfgetcsvの区切り文字を指定することができexplode

explode (string $delimiter , string $string [, int $limit ]); 
+0

カンマで区切られたファイルでは、デリミタとみなされない引用符で囲まれたカンマを使用できます。だから私はgetscvを使いたいのですが、これを正しく処理するためです。 – veli

+0

これは、作業しているデータを認識している限り、まだ実行可能なソリューションです。また、通常はデータはcsv形式で、二重引用符で囲まれています - これは爆発の問題を防ぎます。投票に値するものではない。また、このコードは、CSVデータを解析するためのワイルドでは非常に一般的です... – Radmation

9

を試すことができます()。これは、タブ区切りのファイルを読み込むの一例であり、

ここ
while (($data = fgetcsv($handle, 1000, "\t")) !== FALSE) { 
    ... 
} 
+0

はい、でもCSVファイルにすることができます。問題は、それがcsvか、または削除されたタブかどうかを確認する方法です。 – veli

2

はここmydata.txt CSVフィールド

$tab = "\t"; 

$fp = fopen('mydata.txt', 'r'); 

while (!feof($fp)) 
{ 
    $line = fgets($fp, 2048); 

    $data_txt = str_getcsv($line, $tab); 

    //Get First Line of Data over here 
    print_r($data_txt); 
    exit; 
}        

fclose($fp); 
+0

これは素晴らしいものです。 –

0

を読み込みます例です。私は将来の使用のための私のユーティリティライブラリに追加された機能です。私はNSSec's answerから派生しました。

このソリューションでは、アレイのキーとして最初の行を使用するかどうかを指定できます。おそらく、ある場所で$ first_line_keysパラメータのキーに使用する配列を渡す機能を追加することになります。

/** 
* Converts a CSV file into an array 
* NOTE: file does NOT have to have .csv extension 
* 
* $file - path to file to convert (string) 
* $delimiter - field delimiter (string) 
* $first_line_keys - use first line as array keys (bool) 
* $line_lenght - set length to retrieve for each line (int) 
*/ 
public static function CSVToArray($file, $delimiter = ',', $first_line_keys = true, $line_length = 2048){ 

    // file doesn't exist 
    if(!file_exists($file)){ 
     return false; 
    } 

    // open file 
    $fp = fopen($file, 'r'); 

    // add each line to array 
    $csv_array = array(); 
    while(!feof($fp)){ 

     // get current line 
     $line = fgets($fp, $line_length); 

     // line to array 
     $data = str_getcsv($line, $delimiter); 

     // keys/data count mismatch 
     if(isset($keys) && count($keys) != count($data)){ 

      // skip to next line 
      continue; 

     // first line, first line should be keys 
     }else if($first_line_keys && !isset($keys)){ 

      // use line data for keys 
      $keys = $data; 

     // first line used as keys 
     }else if($first_line_keys){ 

      // add as associative array 
      $csv_array[] = array_combine($keys, $data); 

     // first line NOT used for keys 
     }else{ 

      // add as numeric array 
      $csv_array[] = $data; 

     } 

    } 

    // close file 
    fclose($fp); 

    // nothing found 
    if(!$csv_array){ 
     return array(); 
    } 

    // return csv array 
    return $csv_array; 

} // CSVToArray() 
0
$filePath = "somefile.txt"; 
$delimiter = "\t"; 

$file = new \SplFileObject($filePath); 
while (!$file->eof()) { 
    $line = $file->fgetcsv($delimiter); 
    print_r($line); 
} 
+0

あなたの答えにいくつかの説明を追加して、他のユーザーにとってより価値のあるものにしてください。 – wmk

関連する問題