如何在CSV文件中插入新行?

时间:2015-04-23 10:23:12

标签: php csv

我正在创建一个系统,该系统涉及创建用于错误记录的CSV。

我当前的代码成功创建了一个具有唯一名称的新文件,然后将现有数据(从数组中)添加到CSV中。我遇到的问题是在文件中添加新行,这是维护正确结构所必需的。

我现有的代码:

$current = file_get_contents($fileName);
foreach($error as $err) {
    foreach($err as $title => $info) {
        $current .= $info . ',';
    }
    $current .= "\n";
}
file_put_contents($fileName, $current);

var_dump的数组结构$error如下:

array (size=3)
  0 => 
    array (size=4)
      'id' => string '1' (length=6)
      'name' => string 'Kyle Katarn' (length=19)
      'qty' => string '1' (length=3)
      'date' => string '' (length=0)
  1 => 
    array (size=4)
      'id' => string '2' (length=6)
      'name' => string 'Dash Rendar' (length=23)
      'qty' => string '1' (length=2)
      'date' => string '' (length=0)
  2 => 
    array (size=4)
      'id' => string '3' (length=6)
      'name' => string 'Mara-Jade' (length=24)
      'qty' => string '1' (length=2)
      'date' => string '' (length=0)

我查看了各种不同的SO问题,但没有人解决这个问题。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:5)

使用os独立的全局PHP_EOL

答案 1 :(得分:3)

正如其他人所说,使用PHP_EOL生成一个新行。

但是,我会自己使用fputcsv来确保正确包含内容:

function generateCsv(array $data, $filename,  $delimiter = ',', $enclosure = '"') {
    $handle = fopen($filename, 'r+');
    foreach ($data as $line) {
        fputcsv($handle, $line, $delimiter, $enclosure);
    }
    rewind($handle);
    $contents = '';
    while (!feof($handle)) {
        $contents .= fread($handle, 8192);
    }
    fclose($handle);
    return $contents;
}

// usage
echo generateCsv($data, '/path/to/file.csv');

// or just save the csv to file:
generateCsv($data, '/path/to/file.csv');

此函数以及将csv保存到$filename也会将生成的csv作为字符串返回,如果您想要echo它。

答案 2 :(得分:2)

我认为您可能会受益于使用php的PHP_EOL constant

将现有代码更改为:

$current = file_get_contents($fileName);
foreach($error as $err) {
    foreach($err as $title => $info) {
        $current .= $info . ',';
    }
    $current .= PHP_EOL;
}
file_put_contents($fileName, $current);

答案 3 :(得分:1)

只有字段的开头才有空格字符,空格字符是数据的一部分。 Excel不会剥离前导空格。您将在标题和数据字段中获得不需要的空格。更糟糕的是,“应该”保护“第三栏中的换行符将被忽略,因为它不在该领域的开头。

如果文件中有非ASCII字符(以UTF-8编码),则文件开头应该有UTF-8 BOM(3字节,十六进制EF BB BF)。否则,Excel将根据您的语言环境的默认编码(例如cp1252)而不是utf-8来解释数据,并且您的非ASCII字符将被删除。

以下评论适用于Excel 2003,2007和2013;未在Excel 2000上测试

如果通过在Windows资源管理器中双击其名称来打开文件,则一切正常。

如果您在Excel中打开它,结果会有所不同:

You have only ASCII characters in the file (and no BOM): works.
You have non-ASCII characters (encoded in UTF-8) in the file, with a UTF-8 BOM at the start: it recognises that your data is encoded in UTF-8 but it ignores the csv extension and drops you into the Text Import not-a-Wizard, unfortunately with the result that you get the line-break problem.

选项包括:

Train the users not to open the files from within Excel :-(
Consider writing an XLS file directly ... there are packages/libraries available for doing that in Python/Perl/PHP/.NET/etc