【问题标题】:Can't convert array and display as csv无法转换数组并显示为 csv
【发布时间】:2022-01-12 19:25:00
【问题描述】:

我正在尝试读取 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"';   

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

【问题讨论】:

    标签: php arrays csv spreadsheet


    【解决方案1】:

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

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

    我的建议是将内容存储在一个数组中,并在末尾用逗号分解,有关更多详细信息,请参阅 cmets。

    // 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。

    【讨论】:

    • 万一有人遇到我的第二个问题,原来是文件顶部包含在标题命令之前的文件。该文件中有html代码。我将它移到页面下方,电子表格现在会在加载时打开。
    【解决方案2】:

    您正在使用的 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 的文本文件中,然后尝试使用电子表格程序打开它。

    【讨论】:

    • 感谢您修复逗号。但我可能不清楚第二个问题。当页面加载时,我希望删除文本文件,然后在电子表格文件中打开它。这不是标题语句的目的吗?
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2018-01-24
    • 2018-12-17
    • 2019-02-03
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多