无法转换数组并显示为 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);
此外,如果您的数据可能包含引号,您可能也需要处理它。我个人为此使用了一个库,这通常是矫枉过正的,但我不需要担心它。您还可以使用 fputcsv
和其他方式编写 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);
此外,如果您的数据可能包含引号,您可能也需要处理它。我个人为此使用了一个库,这通常是矫枉过正的,但我不需要担心它。您还可以使用 fputcsv
和其他方式编写 CSV。