Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用fgetcsv解析未转换的双引号_Php_Mysql_Csv - Fatal编程技术网

Php 使用fgetcsv解析未转换的双引号

Php 使用fgetcsv解析未转换的双引号,php,mysql,csv,Php,Mysql,Csv,我正在将CSV文件导入MySQL数据库。要解析CSV,我正在使用fgetcsv()。CSV包含“未转义的字符并导致和错误数组_combine():两个参数的元素数应相等 CSV数据采用以下格式: "GR109 "," ",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0," ","GRANT ","M ","W",0,0.0,0.0,0.

我正在将CSV文件导入MySQL数据库。要解析CSV,我正在使用
fgetcsv()
。CSV包含“未转义的字符并导致和<代码>错误数组_combine():两个参数的元素数应相等

CSV数据采用以下格式:

"GR109     "," ",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0," ","GRANT     ","M          ","W",0,0.0,0.0,0.0,0.0,0.0,0,0,0,0,0,0.0,0.0," ",0,0,0.0," "," "," ",2.42,0.0,0.0,0.0,0.0," "," "," "," "," "," ",0.0,0.0,0.0,0.0,0.0," "," "," "," ","SELF COL  ","16 P PR.  "," ","PLAIN     "," ","R/E1ROW   "," "," "," "," "," "," "," ","R/E1ROW   ","BEADED    "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," ","GRANT     ","GRANT     "," "," ","  "," ",0.0,"  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","VAMP LNG - BLK. CARAVELLE P/S. QTR. LNG./ TNG.LINING - BLK. TORINO. (GREY ""TORINO"" FOR LIZARD.)","GR109 COMPLETE"
我的代码:

function csv_to_array($filename='', $delimiter=',', $enclosure='"', $escapestring='"')
{
if(!file_exists($filename) || !is_readable($filename))
    return FALSE;

$header = NULL;
$data = array();
if (($handle = fopen($filename, 'r')) !== FALSE)
{
    while (($row = fgetcsv($handle, 1000, $delimiter, $enclosure, $escapestring)) !== FALSE)
    {
        if(!$header)
            $header = $row;
        else
            $data[] = array_combine($header, $row);
    }
    fclose($handle);
}
return $data;
}


我添加了“
$escapestring=”
,但这没有帮助。“TORINO”中的“字符未转义”是否存在错误?如果是,是否有方法处理这些字段?

您的代码对我来说运行良好。在下面的示例中,我删除了标题处理,因为您的示例数据不包含任何标题

<?php

function csv_to_array($filename='', $delimiter=',', $enclosure='"', $escapestring='"')
{
    if(!file_exists($filename) || !is_readable($filename))
        return FALSE;

    $data = array();
    if (($handle = fopen($filename, 'r')) !== FALSE) {
        while (($row = fgetcsv($handle, 1000, $delimiter, $enclosure, $escapestring)) !== FALSE) {
            $data[] = $row;
        }
        fclose($handle);
    }
    return $data;
}

$result = csv_to_array('test.csv');
foreach ($result as $key=>$element) {
    echo $key . ' => ' . print_r($element,true) . "\n";
}

上面的正则表达式将删除双引号中的双引号。 它将用于以下方面:

  • “一些文本”内引号“更多文本”

  • “”内引号“更多文本”




  • 好的。我想我找到了。肯定是
    fgetcsv
    中的第二个参数,即行的长度,有点混乱。只需将其更改为0(函数可能工作得比较慢),或者将其加倍。 当它是1000时,它将每一行切割成两行,一行长度正好是1000字符(即使在世界的中间也进行了切割),第二行是新行字符的其余部分。因此,$ROW变量首先是一个长度为117的数组,然后是大约13,再是117和13。 只要改变这个:

    while (($row = fgetcsv($handle, 1000, $delimiter, $enclosure, $escapestring)) !== FALSE)
    
    为此:

    while (($row = fgetcsv($handle, 0, $delimiter, $enclosure, $escapestring)) !== FALSE)
    

    看起来好像是“”(2个双引号)将被解析为引号。也就是说,您可以替换/过滤掉这些引号,然后就可以开始了。您不需要传入
    $escapestring
    ,因为双引号已经通过使用双引号转义了。您可以通过在发布的单行上执行fgetcsv看到这一点,您将获得正确的数组。您可以st是导致错误的最小CSV,包括标题?能否提供更多的CSV文件?尤其是标题。标题中重复的条目(空字符串、数字)可能会把事情搞砸。
    while (($row = fgetcsv($handle, 1000, $delimiter, $enclosure, $escapestring)) !== FALSE)
    
    while (($row = fgetcsv($handle, 0, $delimiter, $enclosure, $escapestring)) !== FALSE)