我正在创建一个系统,该系统涉及创建用于错误记录的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问题,但没有人解决这个问题。任何帮助将不胜感激。
答案 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