用PHP中的逗号或分号文件打开CSV

时间:2016-12-20 17:56:57

标签: php csv

我想用php打开文件CSV,但输入可以是逗号或分号 我该怎么做

我用逗号这样打开文件

if (($handle = fopen($filePath, 'r')) !== false) {
    // get the first row, which contains the column-titles (if necessary)
    $header = fgetcsv($handle);
      while (($data = fgetcsv($handle)) !== false) {
        var_dump($data);
      }
}

我的文件可以是

   Test;option;money
   1;a;1,3
   2;"G;a";1,965,0

OR

   Test,option,money
   1,a,"1,3"
   2,"G;a",1,"965,0"

我如何测试分隔符以使用fgetcsv?

3 个答案:

答案 0 :(得分:4)

也许你可以找到答案in this StackOverflow article。它提出了一种定界符检测方法的实现。实施是:

function getFileDelimiter($file, $checkLines = 2){
        $file = new SplFileObject($file);
        $delimiters = array(
          ',',
          '\t',
          ';',
          '|',
          ':'
        );
        $results = array();
        $i = 0;
         while($file->valid() && $i <= $checkLines){
            $line = $file->fgets();
            foreach ($delimiters as $delimiter){
                $regExp = '/['.$delimiter.']/';
                $fields = preg_split($regExp, $line);
                if(count($fields) > 1){
                    if(!empty($results[$delimiter])){
                        $results[$delimiter]++;
                    } else {
                        $results[$delimiter] = 1;
                    }   
                }
            }
           $i++;
        }
        $results = array_keys($results, max($results));
        return $results[0];
    }

使用该方法可能最终得到:

$delimiter = getFileDelimiter($filePath); // actual path of the file, ex: '../example.csv'

if (($handle = fopen($filePath, 'r')) !== false) {
    // get the first row, which contains the column-titles (if necessary)
    $header = fgetcsv($handle, 0, $delimiter);
      while (($data = fgetcsv($handle)) !== false) {
        var_dump($data);
      }
}

答案 1 :(得分:1)

如果分号和逗号可互换使用,则必须使用一个分隔符读取文件,然后循环遍历每个“列”并通过str_getcsv运行以使用第二个分隔符进行解析。像这样:

if (($handle = fopen($filePath, 'r')) !== false) {
    // get the first row, which contains the column-titles (if necessary)
    $header = fgetcsv($handle);
    while (($data = fgetcsv($handle)) !== false) {
        //create empty array for this line
        $line = array();
        //loop over each "column" read in
        foreach($data as $d){
            //split using second delimeter and merge with line data
            $line = array_merge($line, str_getcsv($d, ';'));
        }
        //display the line
        print_r($line);
    }
}

除此之外,您必须创建/找到支持多个分隔符的自己的csv解析器。

答案 2 :(得分:1)

你可以试试这个:

<?php
if (($handle = fopen($filePath, 'r')) !== false) {
    // Detect delimiter from first line.
    $delimiter = null;
    if ($firstLine = fgets($handle) !== false) {        
        if (strpos($firstLine, ",") !== false) {
            $delimiter = ",";
        } elseif (strpos($firstLine, ";") !== false) {
            $delimiter = ";"
        }
    }

    if (!is_null($delimiter)) {
        $isHeader = true;
        while (($data = fgetcsv($handle, 0, $delimiter)) !== false) {
            if ($isHeader) {
                $isHeader = false;
                continue;
            }

            var_dump($data);
        }
    }
}

首先尝试从第一行检测分隔符,然后在解析csv文件时使用它。