2008-11-22 168 views
3

我试图从a.csv文件中读取数据以将其作为文本输出到网页上。PHP阅读CSV文件的问题

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

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

这样的:

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

在我提出这个实例文件中,有2行。

保罗Blueberryroad 85我们手电筒, 2008袋11月20日,下午4:39

海伦Blueberryroad 85我们lens13mm,手电筒,箱包,ExtraBatteries月 20,2008,16:41: 32

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

保罗; Blueberryroad 85;美国;手电筒,袋; 2008年4:39 11月20日,pmHell恩; Blueberryroad 85;美国; lens13mm,手电筒,箱包,ExtraBatteries; 2008年11月20日,16点41分32秒

我与分裂的:

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

我要的是$名称[]包含“保罗”和“海伦”作为其内容。其他数组接收各自列的值。

相反,我只得到保罗和$订购日期[]内容

二○○八年十一月二十○日,4:39 pmHellen

因此,所有的行被连接起来。有人能告诉我我如何能够实现我所需要的?

编辑:找到的解决方案,只是一个werid件事剩余:

我使用这段代码,现在解决了这个问题:

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

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

+0

你为什么不使用fgetcsv? (http://php.net/fgetcsv) – 2008-11-22 16:05:51

+0

不知道它感到直到这里提到 – Vordreller 2008-11-22 16:43:09

回答

11

您最好使用fgetcsv()一个知道CSV文件结构,并已指定用于处理CSV文件的选项:

所以像你可以做一些事情。或者,您也可以使用str_getcsv()作为文件内容。

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]; 
} 
0

关于fgetcsv的评论是正确的。

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

除此之外,如果你想这样做,你需要首先将文件分成几行,然后分割成几行。

1

我使用这段代码,现在解决了这个问题:

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

出于某种原因,我allthough CSV文件只有两行,则返回2个阵列和1个布尔值。前两个是我的数据数组,布尔值为0.

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; 
}