使用制表符分隔符字符导出CSV不正确

时间:2015-03-12 21:22:39

标签: php csv laravel laravel-4

在我想到这个问题之前,我们会问这个问题,但他们并没有帮助我。 所以,我别无选择。

我使用laravel导出.CSV文件中的数据。

我所做的就是这样 -

$tweets = DB::select(DB::raw($query));
    foreach ($tweets as $row)
    {
        $row = get_object_vars($row);
        // iterate over each tweet and add it to the csv
        $output .="col 11";     //Col 1 item
        $output .="\t";         //Adding New tab
        $output .="col 12";     //Col 2 item
        $output .="\n";     //Adding New Line
    }

    $headers = array(
        'Content-Type' => 'text/csv',
        'Content-Disposition' => 'attachment;filename="'.Carbon\Carbon::now()->toDateTimeString().'.csv"',
    );
    return Response::make(rtrim($output, "\n"), 200, $headers);

因此,要手动添加标签,我所做的就是

  

$ output。=" \ t";

我得到的是这样的东西 -

enter image description here

但我希望有类似的东西 -

enter image description here

有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

正确的CSV要求,分隔符和任何字段,"或者空格需要用双引号括起来,字段中出现的任何双引号都需要加倍,两个连续的双引号被视为转义双引号。

可以使用非标准分隔符,但需要在客户端应用程序上进行配置,而标准CSV格式则不需要。 Excel具有文本到数据,可让您配置分隔符,引用字符等。数字很​​难用,或者至少我很难让Numbers试图让它正确打开非标准的CSV。

控制器类中包含的csv()函数仅用于测试。将其移出或排成一行。代码将包装它需要的任何东西,并将在字段中处理嵌入式\ n。在excel /数字上,它们成为多行文本单元格。

public static
function csv($row)
{
    $csvRow = '';
    foreach ($row as $col)
    {
        $val = str_replace('"', '""', $col);
        if (preg_match('/"|,|\s|\n/', $val))
        {
            $val = "\"$val\"";
        }
        $csvRow .= ',' . $val;
    }
    return substr($csvRow, 1) . "\n";
}

public
function getTest()
{
    if (!appDebug()) return App::Abort(404);

    $tweets = DB::select('SELECT transLine, transID, transLang, transValue FROM utils.translations LIMIT 20');

    $output = '';
    foreach ($tweets as $tweet)
    {
        // output header row, optional
        // if (!$output) $output = self::csv(array_keys(get_object_vars($tweets[0])));
        $row = get_object_vars($tweet);
        $output .= self::csv($row);
    }

    $headers = array(
        'Content-Type' => 'text/csv',
        'Content-Disposition' => 'attachment;filename="' . Carbon\Carbon::now()->toDateTimeString() . '.csv"',
    );
    return Response::make(rtrim($output, "\n"), 200, $headers);
}