无法转换数组并显示为 csv

Can't convert array and display as csv

我正在尝试读取一个 txt 文件,将其转换为 csv 并在电子表格中显示。这里有很多例子,我已经尝试了很多,但结果是一样的。我似乎有两个问题。首先,我用来转换 csv 行的代码在末尾添加了一个额外的逗号,我无法将其删除。其次,即使输入测试字符串,电子表格也不会打开。

当我读入我的测试文件时,我得到一个这样的数组:

    array [
    Hunky Bill's Big Perogie / Pierogi Maker
    9
    4
    10
    5
    5
    1
    2
    1
    ]

我使用的代码是

    $csv_file = 'arry.txt';
    $save_name = 'csvout.csv';

    if (($fp = fopen($csv_file ,'r'))) {  
       while(! feof($fp)) { 
          $item = fgets($fp);
          $item = rtrim($item, "\r\n");
          $csv_string .= '"' . $item . '",';
         
         // $csv_string = substr($csv_string, 0, -1);  
         // $csv_string[strlen($csv_string)] = '';
         // $csv_string = rtrim($csv_string, ',');
       }      
       fclose($fp);  
    }  

    header("Expires: Mon, 26 Nov 2162 00:00:00 GMT");
    header("Last-Modified: " . gmdate('D,d M Y H:i:s') . ' GMT');
    header("Cache-Control: no-cache, must-revalidate");
    header("Pragma: no-cache");
    header("Content-Type: Application/octet-stream");
    header("Content-Disposition: attachment; filename=$save_name");
          
    echo $csv_string;

运行 以上显示在屏幕上:

    "Hunky Bills Big Perogie  Pierogi Maker","9","4","10","5","5","1","2","1","","",

如果我取消注释旨在删除最后一个逗号的三行中的任何一行,则所有逗号都将被删除。这是为什么?

如果我跳过上面的步骤而只是在 echo 语句之前输入这一行,电子表格仍然无法打开。它应该在电子表格程序中打开吗?

    $csv_string = '"Hunky Bills Big Perogie  Pierogi Maker","9","4","10","5","5","1","2","1"';   

谁能看出我的问题在哪里?

您使用的 while 循环在每个项目后添加一个逗号。 “删除最后一个逗号的三行”位于 while 循环内。要解决该问题,请尝试像这样重新组织代码,在 while 循环完成后删除最后一个逗号:

if (($fp = fopen($csv_file ,'r'))) {  
    while(! feof($fp)) { 
        $item = fgets($fp);
        $item = rtrim($item, "\r\n");
        $csv_string .= '"' . $item . '",';
    }
    $csv_string = substr($csv_string, 0, -1);  
    fclose($fp);
}

此外,代码末尾的echo $csv_string指示程序将字符串输出到屏幕,这就是您所看到的。您可能希望将 $csv_string 保存到扩展名为 .csv 的文本文件,然后尝试使用电子表格程序打开它。

首先,在调试此类引用时,跳过所有 header 和 Excel 内容,直到您真正需要它为止。使用原始文本进行调试要容易得多。

其次,查看var_dump而不是echo,它以更清晰的方式显示变量的内容。

我的建议是将内容存储在一个数组中,并在末尾用逗号展开它,详情请参阅评论。

// We'll store items here temporarily
$csv_items = [];

if (($fp = fopen($csv_file, 'r'))) {
    while (!feof($fp)) {

        $item = fgets($fp);

        // Sanity check that we received something
        if (false === $item) {
            break;
        }

        // Trim both sides (unless you have a need for whitespace)
        $item = trim($item);

        // If we still have more than just an empty string
        if ($item) {
            // Append, optionally with quotes
            $csv_items[] = '"'.$item.'"';
        }
    }
    fclose($fp);
}

// Create final string
$csv_string = implode(',', $csv_items);

var_dump($csv_string);

此处演示:https://3v4l.org/Chk2M

此外,如果您的数据可能包含引号,您可能也需要处理它。我个人为此使用了一个库,这通常是矫枉过正的,但我不需要担心它。您还可以使用 fputcsv 和其他方式编写 CSV。