题
我正在尝试从a.csv文件中读取数据,将其作为文本输出到网页上。
这是我第一次这样做,而且我遇到了一个令人讨厌的小问题。
我的.csv文件(默认情况下由Excel打开),有多行,我将整个内容读作一个长字符串。
像这样:$contents = file_get_contents("files/data.csv");
在我制作的这个示例文件中,有2行。
保罗蓝莓路 85 us手电筒,包11月20日, 2008年,下午4:39Hellen Blueberryroad 85 us lens13mm,手电筒,袋子,ExtraBatteries 11月 20,2008,16:41:32
但PHP读取的字符串是这样的:
Paul; Blueberryroad 85; us;手电筒,Bag; 2008年11月20日,下午4:39Hellen; Blueberryroad 85; us; lens13mm,手电筒,手提袋,ExtraBatteries; 2008年11月20日,16:41:32
我将其拆分为:
list($name[], $street[], $country[], $accessories[], $orderdate[]) = split(";",$contents);
我想要的是$ name []包含<!> quot; Paul <!> quot;和<!>“Hellen <!>”;作为其内容。其他数组接收各自列的值。
相反,我只得到保罗,$ orderdate []的内容是
2008年11月20日下午4:39海伦
所以所有行都连接在一起。有人能告诉我如何实现我的需求吗?
编辑:发现解决方案,只留下一个令人讨厌的事情:
我现在用这段代码解决了这个问题:
$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
$contents[] = fgetcsv($fo,0,';');
}
fclose($fo);
出于某种原因,尽管我的CSV文件只有2行,但它返回2个数组和1个布尔值。前两个是我的数据数组,布尔值是0。
解决方案
您最好使用知道CSV文件结构的 fgetcsv()并指定选项用于处理CSV文件。或者,您可以使用 str_getcsv()的内容而是文件。
其他提示
file()函数读取数组中的文件,每一行都是一个条目阵列。
所以你可以这样做:
$rows = array();
$name = array();
$street = array();
$country = array();
$rows = file("file.csv");
foreach($rows as $r) {
$data = explode(";", $r);
$name[] = $data[0];
$street[] = $data[1];
$country[] = $data[2];
}
我现在用这段代码解决了这个问题:
$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
$contents[] = fgetcsv($fo,0,';');
}
fclose($fo);
出于某种原因,尽管我的CSV文件只有2行,但它返回2个数组和1个布尔值。前两个是我的数据数组,布尔值是0。
关于fgetcsv的评论是正确的。
出于教育目的,我仍会回答你的问题。首先,我不明白你的数据(使用逗号)和<!>引用的字符串之间的区别<!>; (它用分号代替一些空格,但不是全部?)。 PS。:我查看了你的消息的源代码,它看起来像TSV(标签)和CSV(昏迷)的奇怪组合。
此外,如果你想这样做,你需要首先分割文件行,然后分割字段中的行。
最好的方法当然是指出fgetcsv()。
$f = fopen ('test.csv', 'r');
while (false !== $data = fgetcsv($f, 0, ';'))
$arr[] = $data;
fclose($f);
但是如果你有一个变量中的内容并希望将其拆分,并且str_getcsv不可用,你可以使用它:
function str_split_csv($text, $seperator = ';') {
$regex = '#' . preg_quote($seperator) . '|\v#';
preg_match('|^.*$|m', $text, $firstline);
$chunks = substr_count($firstline[0], $seperator) + 1;
$split = array_chunk(preg_split($regex, $text), $chunks);
$c = count($split) - 1;
if (isset($split[$c]) && ((count($split[$c]) < $chunks) || (($chunks == 1) && ($split[$c][0] == ''))))
unset($split[$c]);
return $split;
}