Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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_Excel_Csv - Fatal编程技术网

Php 标准化CSV文件类型

Php 标准化CSV文件类型,php,excel,csv,Php,Excel,Csv,我使用的是csv解析器类(http://code.google.com/p/php-csv-parser/)从csv文件中解析和提取数据。我遇到的问题是,它只适用于某些csv文件类型。(似乎Mac、Ms Dos和Windows都有csv类型。) 如果我使用一个使用csv-windows选项保存在mac(excel)上的csv文件,代码就可以工作。但是,如果我在windows计算机上仅将文件保存为csv,则不起作用。(你可能会认为这与在mac上保存csv窗口的格式相同。)如果我将其保存为csv M

我使用的是csv解析器类(http://code.google.com/p/php-csv-parser/)从csv文件中解析和提取数据。我遇到的问题是,它只适用于某些csv文件类型。(似乎Mac、Ms Dos和Windows都有csv类型。)

如果我使用一个使用csv-windows选项保存在mac(excel)上的csv文件,代码就可以工作。但是,如果我在windows计算机上仅将文件保存为csv,则不起作用。(你可能会认为这与在mac上保存csv窗口的格式相同。)如果我将其保存为csv MSDOS文件,它在windows计算机上确实可以工作。这似乎有点可笑

有没有办法标准化这三种文件类型,以便我的代码可以读取上传的任何类型的csv

我想应该是这样的:

$standardizedCSV = preg_replace_all('/\r[^\n]/', '\r\n', $csvContent);
我知道这与每种文件类型处理行尾的方式有关,但我有点想找出这些区别。如果有人有什么建议,请告诉我

谢谢

更新: 这是我正在使用的csv解析器的相关代码,它逐行提取数据:

$c = 0;
$d = $this->settings['delimiter'];
$e = $this->settings['escape'];
$l = $this->settings['length'];

$res = fopen($this->_filename, 'r');

while ($keys = fgetcsv($res, $l, $d, $e)) {

if ($c == 0) {
   $this->headers = $keys;
} else {
   array_push($this->rows, $keys);
}

$c ++;
}

我想我需要了解fgetcsv是如何处理eol的,这样我才能确保以相同的方式处理任何格式的csv文件

我认为行尾不是问题。CSV的问题在于它只是一个“逗号分隔值”文件,除此之外没有标准化。因此,有些系统使用逗号分隔值,有些系统使用分号(
)。我确信有些变体甚至使用其他值分隔符

此外,转义字符(通常是反斜杠)在CSV文件之间可能不同,一些CSV文件在每个值周围也使用引号(

CSV文件可以使用上述内容之间的任何变体。例如,我相当确定Microsoft Excel导出的CSV文件使用分号分隔值,并且在值周围没有任何引号


我相信有一些方法可以自动检测如何解析CSV文件,但最好的方法是让用户自行决定。Excel就是这样做的。

如果使用CSV文件,您必须对许多未正确标准化的细节达成一致意见:

  • 行结尾(Unix 0x0a、Macintosh 0x0d、DOS 0x0d 0x0a)
  • 字段分隔符(逗号、分号等)
  • 字段引用(所有字段都被引用,仅字符串字段,仅包含字段和行分隔符的字符串字段)
  • 字符串字段中双引号的转义(双引号加倍、双引号前的反斜杠字符等)
  • 多行字符串字段(是否允许)
  • 文件编码(ISO-8859-1、UTF-8等)
如果你创建了一个CSV阅读器,你可以自动处理不同的行尾和字段引用,但是CSV解析器必须事先知道其余的

事实标准是Excel生成的CSV格式。但是,Excel使用不同的格式变体:

  • 通常是DOS行尾(但我从未用Excel for Macintosh尝试过)
  • 取决于区域设置的字段分隔符。如果使用逗号将数字分组为长数字,Excel将使用分号作为字段分隔符。否则,使用逗号
  • 如果需要,Excel会使用双引号
  • Excel将字符串字段中的双引号加倍
  • Excel支持多行字符串字段
  • 文件编码似乎是当前区域设置的文件编码。因此它会有所不同

    • 这似乎起到了作用:

          ini_set("auto_detect_line_endings", true);
      

      问题在于行结尾,但我不需要创建自己的EOL解析器。此运行时设置为我解决了此问题。请参阅。

      UPDATE我正在将csv解析器中的相关代码添加到我的原始帖子中,以便您可以看到它如何处理EOL。我认为EOL是问题所在的原因是,当我的解析器运行在不兼容的cvs类型(如上所述),$csvparser->headers变量记录整个文件-它不仅记录第一行的字段。兼容的csv类型非常整齐地将标题存储在$this->headers中,将数据行存储在$this->rows中。因此,不知何故,某些文件类型的EOL会导致while循环迭代,而其他文件类型则不会。此外,当我查看兼容和非兼容的csv类型时mpliant csv文件类型在文本编辑器中并排显示,它们与分隔值的逗号完全相同。(我使用BBEdit进行此操作。)两者之间的唯一区别是BBEdit表示兼容版本为“Windows(CRLF)”格式-(这在BBEdit窗口底部的下拉列表中。我无法“看到”EOL。但是……感谢您的详细响应。我确实标准化了行尾,以符合DOS格式-0x0d 0x0a,该格式适用于一个文件,但不适用于另一个文件。我没有查看该文件是否以不同的方式不符合要求。-可能有例如,使用冒号而不是逗号来描述信息。我将在上午查看,并向您汇报。非常感谢。