2009-09-03 89 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

相关问题