【问题标题】:Avoid default quotes from csv file when using fputcsv使用 fputcsv 时避免使用 csv 文件中的默认引号
【发布时间】:2012-07-16 00:55:44
【问题描述】:

使用 fputcsv 避免来自 csv 的默认引号

fputcsv($fp, $array, ',', '"'); // OR fputcsv($fp, $array);

在 test.csv 中

testname,045645765789,"""04.07.2012 12:10:52"""

这里如何避免上面的引号?

如下图

testname,045645765789,04.07.2012 12:10:52

【问题讨论】:

  • 似乎你会得到三个 " 引号的原因是因为该日期字符串已经被 " 引号包围。 (请参阅example in the docs。)在将数组传递给fputcsv()implode() 之前删除引号,手动使用逗号而不是使用fputcsv()
  • 是的,但是由于字符串testname,045645765789,"04.07.2012 12:10:52" 中有空格,所以会有一个引号。如何避免?

标签: php fputcsv


【解决方案1】:

两个双引号用于转义双引号,因此看起来您的日期/时间已被引用。如果您只想获得正确引用的 CSV,可以尝试删除任何现有的双引号(这可能有点蛮力):

$array = array('testname',045645765789,'"04.07.2012 12:10:52"');
$array = str_replace('"', '', $array);

fputcsv($fp, $array);

// Output: testname,79323055,"04.07.2012 12:10:52"

fputcsv 想要将 something 放在一个带有空格的字符串周围,所以如果你根本不想要引号,你要么需要解决,要么制作自己的函数来做你想要什么。 this question 下有很多好的解决方案(编辑:这是一个不同的链接)。或者,PHP manual 的 cmets 中还有许多其他解决方案。

根据第一个链接,您可以这样做:

$array = array('testname',045645765789,'"04.07.2012 12:10:52"');
$array = str_replace('"', '', $array);

fputs($fp, implode(',', $array)."\n");

// Output: testname,79323055,04.07.2012 12:10:52 

【讨论】:

  • 是的日期/时间已经被引用,如果我避免引用,由于字符串中的空格,仍然会留下一个引号,如 testname,045645765789,"04.07.2012 12:10:52"。如何避免?
  • 正如我在回答中所说的那样,使用fputcsv 你真的无法避免这种情况。查看我发布的链接,了解一系列解决方法。
  • @JustinJohn 抱歉,我发布的第一个链接与我的意图不同(现已更正)。我已经更正了它并添加了一些代码来演示实现您所追求的一种方法。
  • 谢谢,它有效。是否可以使用fputcsv 而不是fputs 重现相同的结果?
  • 好东西!总之,你不能。 fputcsv总是将带有空格的字符串包含在其中。
【解决方案2】:

我知道这是一个老问题,但我有一个类似的问题,最终放弃了fputcsv,只是echo用正确的标题告诉浏览器下载文件。我知道这并没有专门解决fputcsv 的问题,但考虑到我花在它上面的时间并意识到没有解决空间问题的方法(除了可能比问题应得的更多工作之外,如果它甚至可能),我选择了最简单的解决方案。如果目标是创建一个动态的、可下载的 CSV 文件,那么下面的代码可以轻松灵活地完成任务。我的问题是我需要根据我正在使用的服务的要求将所有字段都用双引号括起来。但是有些字段有空格,这意味着fputcsv 会自动添加单(或双)引号,这意味着我得到了像"'this is a value'" 这样的值。无论我尝试什么,它都不会正确输出数据。所以这解决了它(但是,它不使用fputcsv,但我认为没有必要,因为结果是相同的):

$filename="my_file.csv";
header("Content-Type: text/csv; charset=utf-8");
header("Content-Disposition: attachment; filename=$filename");

for ($i=0; $i<=10; $i++) {
    $value1 = "Here is some value";
    $value2 = "Here is another value";
    $value3 = "Another value";

    echo $value1 . ",";
    echo $value2 . ",";
    echo $value3;
    if ($i != 10) echo "\n"; //only add new line if it's not the last line
}

如果需要,您也可以选择将值用双引号括起来,就像我做的那样:

for ($i=0; $i<=10; $i++) {
    $value1 = "Here is some value";
    $value2 = "Here is another value";
    $value3 = "Another value";

    echo '"'. $value1 . "\",";
    echo '"'. $value2 . "\",";
    echo '"'. $value3 . "\"";
    if ($i != 10) echo "\n"; //only add new line if it's not the last line
}

希望如果有人遇到此特定格式问题,这可以节省他们的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多