PHP读取CSV文件时出现问题

PHP读取CSV文件时出现问题,php,file-io,csv,Php,File Io,Csv,我试图从.csv文件中读取数据,将其作为文本输出到网页上 这是我第一次这样做,我遇到了一个棘手的小问题 我的.csv文件(默认情况下由Excel打开)有多行,我将整个文件作为一个长字符串读取 像这样: $contents = file_get_contents("files/data.csv"); 在我制作的这个示例文件中,有两行 保罗蓝莓 85美国手电筒,包11月20日, 2008年,下午4:39 海伦蓝莓 85美国透镜13MM,手电筒,包,额外电池 200816:41:32 但是PHP读取

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

这是我第一次这样做,我遇到了一个棘手的小问题

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

像这样:

$contents = file_get_contents("files/data.csv");
在我制作的这个示例文件中,有两行

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

海伦蓝莓 85美国透镜13MM,手电筒,包,额外电池 200816:41:32

但是PHP读取的字符串是:

保罗;蓝莓85;美国;手电筒、手袋;2008年11月20日,下午4:39;蓝莓85;美国;透镜13MM、手电筒、包、电池;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);
$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
  $contents[] = fgetcsv($fo,0,';');
}
fclose($fo);
出于某种原因,尽管我的CSV文件只有2行,但它返回2个数组和1个布尔值。前2个是我的数据数组,布尔值为0。

函数读取数组中的文件,每一行都是数组的一个条目

因此,您可以执行以下操作:

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

您最好使用它,它了解CSV文件结构,并具有处理CSV文件的指定选项。或者,您也可以在文件内容上使用。

关于fgetcsv的备注是正确的


出于教育目的,我仍然会回答你的问题。首先,我不理解您的数据(使用comas)和“PHP读取的字符串”(它用分号代替了一些空格,但不是全部?)之间的区别。 注:我看了你的消息的源代码,它看起来像是TSV(标签)和CSV(coma)的奇怪组合


此外,如果要这样做,需要先将文件拆分为行,然后再拆分为字段。

我现在使用以下代码解决了这个问题:

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

出于某种原因,尽管我的CSV文件只有2行,但它返回2个数组和1个布尔值。前2个是我的数据数组,布尔值是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;
}
函数str_split_csv($text,$separator=';')){
$regex='#'。preg_quote($separator)。“|\v#”;
preg_match(“|^.$|m”,$text,$firstline);
$chunks=substr\u count($firstline[0],$separator)+1;
$split=array\u chunk(preg\u split($regex,$text),$chunks);
$c=计数($split)-1;
如果(isset($split[$c])&($split[$c])<$chunks)| |($chunks==1)和($split[$c][0]==“”)))
未结算($split[$c]);
返回$split;
}

为什么不使用fgetcsv?()直到这里提到(它用分号代替了一些空格,但不是全部?)才知道它是被截断的,所以看起来是这样的。我现在正在用fgetcsv进行测试。返回数组的最后一个元素始终是布尔值0。