0

我有一个这样的数组

$rowArray = array(
    array(
        "http://www.website.com/article.html",
        "09/18/2013",
        "An article about stuff"
    ),
    array(
        "http://www.google.com",
        "09/18/2013",
        "The Google",
    )
);

我想制作一个像这样的 .txt 文件:

http://www.website.com/article.html,09/18/2013,"An article about stuff"\r\n
http://www.google.com,09/18/2013,"The Google"\r\n

请注意带有空格和逗号的字符串周围的“引号”以及 \r\n 返回。

我试过这个:(我将标题设置在其他地方和他们的罚款)

$op = fopen("php://output", "w"); 

foreach($rowArray AS $row) {
    $row[] = "\r\n";
    fputcsv($op, $row);
}

fclose($op);

和这个

$row[] = "\r\n";
fwrite($op, implode(",",$row));

和这个

echo mb_convert_encoding(implode(",", $row) . "\r\n", 'UTF-8');

我需要转换它,因为我的数据库中有从网络上抓取的字符,并且文本编辑器需要是 UTF-8。谁能帮我?我似乎无法得到双引号和 \r\n 和“引号”。提前致谢。

4

2 回答 2

0

好的,这就是我需要的

  • 字符编码为 UTF-8
  • \r\n 的行尾
  • 带有空格或逗号的字符串双引号,因此它不会破坏 csv 格式(即使我将其保存为 txt 文件)

我最终做的是重写 fputcsv 函数。我只更改了三行,并在下面留下了评论,因此您可以看到我所做的更改。

protected function _putcsv(&$handle, $fields = array(), $delimiter = ',', $enclosure = '"') {
    $str = '';
    $escape_char = '\\';
    // I changed $value to $valueRaw so I could convert it easily
    foreach ($fields as $valueRaw) {
        // I added this line to convert to UTF-8 to set the $value variable
        $value = mb_convert_encoding($valueRaw, 'UTF-8');
        if (strpos($value, $delimiter) !== false ||
                strpos($value, $enclosure) !== false ||
                strpos($value, "\n") !== false ||
                strpos($value, "\r") !== false ||
                strpos($value, "\t") !== false ||
                strpos($value, ' ') !== false) {
            $str2 = $enclosure;
            $escaped = 0;
            $len = strlen($value);
            for ($i = 0; $i < $len; $i++) {
                if ($value[$i] == $escape_char) {
                    $escaped = 1;
                } else if (!$escaped && $value[$i] == $enclosure) {
                    $str2 .= $enclosure;
                } else {
                    $escaped = 0;
                }
                $str2 .= $value[$i];
            }
            $str2 .= $enclosure;
            $str .= $str2 . $delimiter;
        } else {
            $str .= $value . $delimiter;
        }
    }
    $str = substr($str, 0, -1);
    // I changed the string ending from just "\n" to "\r\n"
    $str .= "\r\n";
    return fwrite($handle, $str);
}

问题解决了。感谢您的回答!

于 2013-09-18T17:08:34.613 回答
0

尝试

foreach ($rowArray as $row){
    $row[2] = '"' . $row[2] . '"';
    fwrite($op, implode(',', $row) . "\r\n");
}

http://codepad.org/XBUVbbN0

于 2013-09-18T16:05:24.710 回答