PHP fgetcsv()分隔符';'未识别

时间:2016-06-10 12:19:08

标签: php csv

似乎我对“;”有疑问分隔符。这是我的csv文件:

First Name;Last Name;Email;Age
Julie;Brown;julie@example.com;52
Dan;Wong;dan@example.com;19
Tim;Hortons;tim@example.com;27

和我的PHP代码:

$row = 1;
if (($handle = fopen("upload/".$_FILES['fichier']['name'], "r")) !== FALSE) {
    while (($data = fgetcsv($handle, ";")) !== FALSE) {
        $num = count($data);
        echo "<p> $num champs à la ligne $row: <br /></p>\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        }
    }
fclose($handle);
}

我有这个说法:

1 champs à la ligne 1: 
First Name;Last Name;Email;Age
1 champs à la ligne 2: 
Julie;Brown;julie@example.com;52
1 champs à la ligne 3: 
Dan;Wong;dan@example.com;19
1 champs à la ligne 4: 
Tim;Hortons;tim@example.com;27
当我使用','分隔符

时,

而不是这样的东西

4 champs à la ligne 1: 
First Name
Last Name
Email
Age

此外,我想知道是否有可能有各种分隔符。因为我想显示用户上传的csv文件,我不想强​​迫他们使用一个预定的分隔符。

由于

3 个答案:

答案 0 :(得分:2)

  

数组fgetcsv(资源$ handle [,int $ length = 0 [,string $ delimiter =“,”[,string $ enclosure ='“'[,string $ escape =”\“]]]])

Manual

第二个参数是长度。

fgetcsv($handle, 0, ";")

答案 1 :(得分:2)

第二个参数是长度,所以你的fgetcsv应该是

fgetcsv($handle, 0, ';');

导致

4 champs à la ligne 1: 

First Name
Last Name
Email
Age
4 champs à la ligne 2: 

Julie
Brown
julie@example.com
52
4 champs à la ligne 3: 

Dan
Wong
dan@example.com
19
4 champs à la ligne 4: 

Tim
Hortons
tim@example.com
27

至于关于变量分隔符的第二个问题。到目前为止,最简单的方法是允许用户定义在上传表单上使用哪个分隔符,可能使用可接受分隔符的select元素,然后在读取csv时使用它。

例如

$allowedDelimiters = [',', ';'];
$defaultDelimiter = ';';
if (true === empty($_POST['delimiter'])) {
    $_POST['delimiter'] = $defaultDelimiter;
}
if (!in_array($_POST['delimiter'], $allowedDelimiters, true)) {
    $_POST['delimiter'] = $defaultDelimiter;
    //alternatively redirect back to the form with an error message
}
$delimiter = $_POST['delimiter'];

您还可以解析检查所需分隔符的行。

$filename = "upload/".$_FILES['fichier']['name'];
if (($handle = fopen($filename, "r")) !== false) {
    $content = fread($handle, filesize($filename));
    fclose($handle);
    //count the delimiters
    $semiColons = substr_count($content, ';');
    $commas = substr_count($content, ',');
    //read each row
    $rows = str_getcsv($content, "\n");
    $rowCount = count($rows);
    $delimiter = null;
    foreach ($rows as $line => $row) {
        //check the delimiters
        if (false === isset($delimiter)) {
            /* 
              determine if the delimiter total divided by the number 
              of rows matches the delimiters found on this row 
              and use it to parse the columns 
            */
            if ($semiColons > 0 && $semiColons / $rowCount === substr_count($row, ';')) {
                $delimiter = ';';
            } elseif ($commas > 0 && $commas / $rowCount === substr_count($row, ',')) {
                $delimiter = ',';
            }
        }
        //read the columns using the detected delimiter 
        //otherwise use a default if a delimiter could not be determined
        $columns = str_getcsv($row, $delimiter ? : ';');
        echo "<p>$rowCount champs à la ligne " . ($line + 1) . "</p>\n";
        foreach ($columns as $column) {
            echo $column . "<br/>\n";
        }
    }
}

答案 2 :(得分:1)

函数fgetcsv包含五个参数。这是它的声明:

fgetcsv(resource, lenght, delimiter, enclosure, escape)

这是我的资源file.csv

"mydata1|mydata2|mydata3|my;data;with;ugly"char;|myprice|etc|etc|

在我的情况下,分隔符是竖线字符|。分号不是定界符。由于数据中有双引号",因此我们将单引号字符'用作附件。没有外壳,输出将为空。

这是源代码:

$mycsv = fopen("file.csv", "r");

while (($data = fgetcsv($mycsv, 0, "|", "'")) == true) {
   print_r($data);
}

以下是输出数据:

Array
(
    [0] => "mydata1
    [1] => mydata2
    [2] => mydata3
    [3] => my;data;with;ugly"char;
    [4] => myprice
    [5] => etc
    [6] => etc
    [7] => 
)

您还可以查看以下Ideone代码段:https://ideone.com/30OF1Kfile.csv文件已替换为stdin