3

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

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

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

像这样:

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

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

Paul Blueberryroad 85 us 手电筒,包 2008 年 11 月 20 日,下午 4:39

Hellen Blueberryroad 85 us lens13mm,手电筒,包包,ExtraBatteries 2008-11-20 16:41:32

但是 PHP 读取的字符串是这样的:

Paul;Blueberryroad 85;我们;手电筒,包;2008 年 11 月 20 日,下午 4:39Hellen;Blueberryroad 85;我们;lens13mm,手电筒,包,额外电池;2008 年 11 月 20 日,16:41:32

我将其拆分为:

list($name[], $street[], $country[], $accessories[], $orderdate[]) = split(";",$contents);

我想要的是 $name[] 包含“Paul”和“Hellen”作为其内容。其他数组接收它们各自列的值。

相反,我只得到 Paul 并且 $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 个布尔值。前 2 个是我的数据数组,布尔值为 0。

4

5 回答 5

11

您最好使用fgetcsv(),它知道 CSV 文件结构并指定了处理 CSV 文件的选项。或者,您可以对文件的内容使用str_getcsv() 。

于 2008-11-22T16:07:46.403 回答
1

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];
}
于 2008-11-22T16:06:55.657 回答
1

我现在通过使用这段代码解决了它:

$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
  $contents[] = fgetcsv($fo,0,';');
}
fclose($fo);

出于某种原因,尽管我的 CSV 文件只有 2 行,但它返回 2 个数组和 1 个布尔值。前 2 个是我的数据数组,布尔值为 0。

于 2008-11-22T16:28:38.157 回答
0

关于 fgetcsv 的评论是正确的。

出于教育目的,我仍然会回答您的问题。首先,我不明白您的数据(带逗号)和“PHP 读取的字符串”之间的区别(它用分号代替了一些空格,但不是全部?)。PS.:我查看了您消息的源代码,它看起来像是 TSV(选项卡)和 CSV(昏迷)的奇怪组合。

此外,如果你想这样做,你需要先将文件拆分成行,然后再拆分字段中的行。

于 2008-11-22T16:16:56.823 回答
0

正如指出的那样,最好的方法当然是 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;
}
于 2008-11-22T16:49:50.953 回答