Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.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导入CSV_Php_Csv_Import - Fatal编程技术网

通过PHP导入CSV

通过PHP导入CSV,php,csv,import,Php,Csv,Import,我正在将.CSV导入具有以下内容的应用程序: if (($handle = fopen($file, "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { $num = count($data); echo "<p> $num fields in line $row: <br /></p>\n"; $row

我正在将.CSV导入具有以下内容的应用程序:

if (($handle = fopen($file, "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
        echo "<p> $num fields in line $row: <br /></p>\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        }
    }
    fclose($handle);
}
if(($handle=fopen($file,“r”))!==FALSE){
while(($data=fgetcsv($handle,1000,“,”)!==FALSE){
$num=计数($data);
echo“$num字段位于第$row行:

\n”; $row++; 对于($c=0;$c<$num;$c++){ echo$data[$c]。“
\n”; } } fclose($handle); }
这算是可行的,但还远远不够完美。我想首先取出行头并将它们放入一个数组中,然后在每行循环以获取数据集

它似乎有划界问题,因为第一行(标题)也包括第二行的一些部分


我直接从Excel导出了.csv文件。不知道是否有编码技巧等我可能丢失。

听起来你的
1000
限制不够长;您应该为该文件将其设置为足够高的值。。。或者设置为
0
以获得无限(不推荐,因为它往往较慢)

首先将其设置为
4096
8192
,然后查看运行情况

// use 8kB buffer for reading comma delimited line
while (($data = fgetcsv($handle, 8192, ",")) !== FALSE) {
更新

好吧,再想想,也许你应该检查一下文件,确认几件事:

  • 分隔符真的是逗号吗?(我想你已经证实了这一点)
  • 字符串附件是否总是双引号
  • 字符串是用反斜杠(默认值)还是另一个双引号转义的

  • 听起来你的
    1000
    限制不够长;您应该为该文件将其设置为足够高的值。。。或者设置为
    0
    以获得无限(不推荐,因为它往往较慢)

    首先将其设置为
    4096
    8192
    ,然后查看运行情况

    // use 8kB buffer for reading comma delimited line
    while (($data = fgetcsv($handle, 8192, ",")) !== FALSE) {
    
    更新

    好吧,再想想,也许你应该检查一下文件,确认几件事:

  • 分隔符真的是逗号吗?(我想你已经证实了这一点)
  • 字符串附件是否总是双引号
  • 字符串是用反斜杠(默认值)还是另一个双引号转义的
  • 为什么不使用file()

    为什么不使用file()


    fgetcsv
    并不总是正确检测行尾

    在fgetcsv调用之前尝试使用:

    ini_set('auto_detect_line_endings', true);
    

    fgetcsv
    并不总是正确检测行尾

    在fgetcsv调用之前尝试使用:

    ini_set('auto_detect_line_endings', true);
    

    我改成了8192,得到了同样的结果

    while (($data = fgetcsv($handle, 8192, ",")) !== FALSE) {
    ...
    }
    
    然后做了这个,得到了同样的结果

    $handle = fopen($_FILES['filename']['tmp_name'], "r");
    ini_set('auto_detect_line_endings', true);
        while (($data = fgetcsv($handle, 8192, ",")) !== FALSE) {
             $data = array_map('mysql_real_escape_string', $data);
    

    我改成了8192,得到了同样的结果

    while (($data = fgetcsv($handle, 8192, ",")) !== FALSE) {
    ...
    }
    
    然后做了这个,得到了同样的结果

    $handle = fopen($_FILES['filename']['tmp_name'], "r");
    ini_set('auto_detect_line_endings', true);
        while (($data = fgetcsv($handle, 8192, ",")) !== FALSE) {
             $data = array_map('mysql_real_escape_string', $data);
    

    CSV中的值可能包含换行符,因此此方法无法可靠工作。CSV中的值可能包含换行符,因此此方法无法可靠工作。我遇到的棘手问题是,我希望将第一行作为标题读取,然后将信息附加到每个标题,以获得更多的行。但是,与Excel中的显示方式相比,这些行的读取方式似乎有些偏差。我认为问题可能与它保存的格式有关。我有一个棘手的问题,就是我想把第一行读作标题,然后将信息附加到每个标题上,以获得更多的行。但是,与Excel中的显示方式相比,这些行的读取方式似乎有些偏差。我认为问题可能与它保存的格式有关。