【发布时间】:2016-02-09 14:29:18
【问题描述】:
我有一个 PHP 脚本,它以 TXT 格式读取数据库,清理日期字段并将其转换为 CSV。
我必须读取一行,将每个字段(除以字符数)分成一个数组,应用清理日期函数并以特定顺序将其导出到 CSV 文件中。
以这一行为例:
001001010006700603927229/05/201529/05/2016TELESALUD J312324366523/01/2016RODRIGUEZ ALBERTO 0012345678 RODRIGUEZ JUAN 008765432101/01/1960MTITULAR APLICA
我把它分隔成一个数组:
$input = [
trim(substr($line, 0, 3)),
trim(substr($line, 3, 3)),
trim(substr($line, 6, 7)),
trim(substr($line, 13, 9)),
trim(substr($line, 22, 10)),
trim(substr($line, 32, 10)),
trim(substr($line, 42, 50)),
trim(substr($line, 92, 1)),
trim(substr($line, 93, 10)),
trim(substr($line, 103, 10)),
trim(substr($line, 113, 50)),
trim(substr($line, 163, 10)),
trim(substr($line, 173, 20)),
trim(substr($line, 193, 50)),
trim(substr($line, 243, 10)),
trim(substr($line, 253, 10)),
trim(substr($line, 263, 1)),
trim(substr($line, 264, 40)),
trim(substr($line, 304, 50)),
trim(substr($line, 354, 10))
];
然后,将函数应用到对应的字段后,我用这个数组重新组织它们:
$output = [
'3',
'3',
$input[10],
$input[13],
$input[15],
$input[16],
'',
'',
'',
'',
$input[17],
'',
$input[3],
$input[14],
$input[4] ." " .$input[5],
'',
$input[19],
$input[0] .$input[1] .$input[2] .$input[3]
];
最后,通过这个函数,我将结果导出到 CSV:
fputcsv($csv, $output, ";");
我的麻烦来了。 PHP 决定在特定字段中包含双引号。结果如下:
3;3;"RODRIGUEZ ALBERTO";"RODRIGUEZ JUAN";19600101;M;;;;;TITULAR;;006039272;0087654321;"20150529 20160529";;APLICA;0010010100067006039272
所有字段都应该是字符串格式,但我的猜测是 PHP 在包含空格的字段中包含双引号。
如果我将附件指定为这样的空字符:
fputcsv($csv, $output, ";", "");
或者像这样:
fputcsv($csv, $output, ';', chr(0));
它只是不会在 CSV 中写入任何行。 apache日志说外壳必须是一个字符。并且空白不是我们的选择。
此脚本在小型服务器上运行,但处理数百万行。我不想包含另一个删除引号的函数。
有没有办法告诉 PHP 不要在 CSV 中包含这些双引号?
【问题讨论】:
-
去掉引号的函数是
fgetcsv()。使用它,不用担心 PHP 会生成有效且可移植的 CSV。 -
我希望我能做到这一点,但 CSV 转到另一家公司,该公司明确表示双引号对他们来说是非法字符。如果我使用另一个函数来删除引号,它会增加 6 个小时的过程。我希望有办法。