2009-09-03 92 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 2009-09-03 09:53:03

+0

也許在第一行計算製表符和逗號(以及其他潛在分隔符),然後將它們與第二行進行比較等等。無論哪一個最一致的是你可能的分隔符。不幸的是,這是一種雙通的解決方案,但是當你有這樣一個未知的時候,這往往是這樣的。 – Rikki 2013-07-13 17:44:10

0

讀取整個文件,或逐行讀取並使用拆分進行分割。

在那裏你可以包含任意分隔符的正則表達式。我沒有PHP在這裏測試一個聲明,但php.net - >搜索split()。 你還有一個關於正則表達式的評論。

+0

但這種方法將消除getcsv的外殼的功能,有可能擊敗所有的目的,但最簡單的CSV文件。 – dimo414 2009-09-03 09:01:10

0

你可以嘗試explode

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

在逗號分隔的文件中,引號內可以有一個逗號,它不被視爲分隔符。這就是爲什麼我想使用getscv,因爲它可以正確處理。 – veli 2009-09-03 09:56:40

+0

只要你意識到你正在使用的數據,這仍然是一個可行的解決方案。通常數據是csv格式是雙引號合格的 - 這可以防止爆炸問題。不值得投票imo。此外,此代碼在解析CSV數據時非常常見... – Radmation 2017-08-07 18:07:32

9

您可以指定fgetcsv分隔符()。這是閱讀製表符分隔文件的一個例子,

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

是的,但它也可以是csv文件。問題是如何確定它是否是csv或tab delemited。 – veli 2009-09-03 10:30:04

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

這是一個不錯的。 – 2016-10-24 18:18:50

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 2017-02-02 19:39:08

相關問題