我正在尝试从a.csv文件中读取数据,将其作为文本输出到网页上。

这是我第一次这样做,而且我遇到了一个令人讨厌的小问题。

我的.csv文件(默认情况下由Excel打开),有多行,我将整个内容读作一个长字符串。

像这样:

$contents = file_get_contents("files/data.csv");

在我制作的这个示例文件中,有2行。

  保罗蓝莓路   85 us手电筒,包11月20日,   2008年,下午4:39

     

Hellen 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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top