Php 如何使用fgetcsv()解析csv文件中以分号分隔的文本行

Php 如何使用fgetcsv()解析csv文件中以分号分隔的文本行,php,csv,text-parsing,Php,Csv,Text Parsing,我正在尝试读取一个CSV文件,并将其转换为这样的数组 $h = fopen("onderdelen-test.csv", "r"); echo '$parts = array('; if($h) { while (($data = fgetcsv($h, 1000)) !== FALSE) { foreach ($data as $num) { $part = explode(';', "$num"); echo "a

我正在尝试读取一个CSV文件,并将其转换为这样的数组

$h = fopen("onderdelen-test.csv", "r");

echo '$parts = array(';

if($h) {
    while (($data = fgetcsv($h, 1000)) !== FALSE) {
        foreach ($data as $num) {
            $part = explode(';', "$num");

            echo "array('partid' => '$part[0]', ";
            echo "'descr' => '$part[1]'), ";
        }
    }
    fclose($h);
}

echo ')';
csv看起来像这样

123456 ; partdescription
234567 ; partdescription, anotherdescription
345678 ; part, description and some other description
问题是它也会在逗号上爆炸,而不仅仅是在分号上爆炸。 我试着在描述周围加上引号,但确实在描述周围加上了一些我无法摆脱的奇怪问号

编辑1:
如果在fgetcsv函数中使用分号作为分隔符,则无法按键检索值,每次找到分号时,它都会启动另一个循环。

解析csv文件的简单代码段:

    $i=0; $keys=array(); $output=array();
    $handle=fopen("onderdelen-test.csv", "r");
    if ($handle){
        while(($line = fgetcsv($handle,0,';')) !== false) {
            $i++;
            if ($i==1) {
                $keys=$line;
            } elseif ($i>1){
                $attr=array();
                foreach($line as $k=>$v){
                    $attr[trim($keys[$k])]=$v;
                }
                $output[]=$attr;
            }
        }
        fclose($handle);
    }

    //$output here is your data array
在这里,您将从csv文件中获得关联数组,其中包含文件第1行中的键

    id ; description
123456 ; partdescription
234567 ; partdescription, anotherdescription
345678 ; part, description and some other description
结果数组:

Array
(
    [0] => Array
        (
            [id] => 123456 
            [description] =>  partdescription
        )

    [1] => Array
        (
            [id] => 234567 
            [description] =>  partdescription, anotherdescription
        )

    [2] => Array
        (
            [id] => 345678 
            [description] =>  part, description and some other description
        )

)

您的
echo
有点太不对劲了。

解析csv文件的简单片段:

    $i=0; $keys=array(); $output=array();
    $handle=fopen("onderdelen-test.csv", "r");
    if ($handle){
        while(($line = fgetcsv($handle,0,';')) !== false) {
            $i++;
            if ($i==1) {
                $keys=$line;
            } elseif ($i>1){
                $attr=array();
                foreach($line as $k=>$v){
                    $attr[trim($keys[$k])]=$v;
                }
                $output[]=$attr;
            }
        }
        fclose($handle);
    }

    //$output here is your data array
在这里,您将从csv文件中获得关联数组,其中包含文件第1行中的键

    id ; description
123456 ; partdescription
234567 ; partdescription, anotherdescription
345678 ; part, description and some other description
结果数组:

Array
(
    [0] => Array
        (
            [id] => 123456 
            [description] =>  partdescription
        )

    [1] => Array
        (
            [id] => 234567 
            [description] =>  partdescription, anotherdescription
        )

    [2] => Array
        (
            [id] => 345678 
            [description] =>  part, description and some other description
        )

)

你的
echo
事情真的有点不对劲。

保持简单,你所要做的就是在继续做更大的事情之前先看看这个输入产生了什么

123456 ; partdescription
234567 ; partdescription, anotherdescription
345678 ; part, description and some other description
此代码,请注意,我已将第三个参数添加到
fgetcsv

<?php
$h = fopen("onderdelen-test.csv", "r");

if($h) {
    while (($data = fgetcsv($h, 1000, ';')) !== FALSE) {
        print_r($data);
        echo "partid = " . trim($data[0]) . "\n";
        echo "descr  = " . trim($data[1]) . "\n";
    }
    fclose($h);
}

保持它的简单性,你所要做的就是在继续做更大的事情之前,先看看从这个输入中产生了什么

123456 ; partdescription
234567 ; partdescription, anotherdescription
345678 ; part, description and some other description
此代码,请注意,我已将第三个参数添加到
fgetcsv

<?php
$h = fopen("onderdelen-test.csv", "r");

if($h) {
    while (($data = fgetcsv($h, 1000, ';')) !== FALSE) {
        print_r($data);
        echo "partid = " . trim($data[0]) . "\n";
        echo "descr  = " . trim($data[1]) . "\n";
    }
    fclose($h);
}


第三个参数-$delimiter@ineersa我喜欢你杀掉西方许多最快的枪的方式:)@ineersa在底部添加了我的观点,我尝试了这个,但每次都会启动一个新的循环:你不必用双引号将变量括起来
$part=explode(“;”,$num)
PPS:您可以构建一个数组,然后
print\r($part)并获得该数组的可视化表示,您不必像设计第三个参数一样设计输出-$delimiter@ineersa爱你杀死西方许多最快枪支的方式:)@ineersa在底部补充了我的观点,我尝试过这个方法,但每次都会启动一个新循环:不必用双引号将变量括起来
$part=explode(“;”,$num)
PPS:您可以构建一个数组,然后
print\r($part)
并获得该数组的可视化表示,您不必像现在这样设计输出。您可能希望对该方法进行de,以使初学者更容易理解,特别是因为OP没有使用class@RiggsFolly如果有任何改进,请随意编辑。删除了函数声明。这也会产生一个wierd输出。你可能想测试一下。它丢失了一个输入行,或者您在第1行中添加了一个标题行,您正在跳过它,对不起,我的错误。虽然OP的输入文件没有标题行@RiggsFolly我试过了,但输入真的很奇怪。我需要它是partid,[1]=>descr
,你可能想去定义这个方法,让初学者更容易理解,特别是因为OP没有使用class@RiggsFolly如果有任何改进,请随意编辑。删除了函数声明。这也会产生一个wierd输出。你可能想测试一下。它丢失了一个输入行,或者您在第1行中添加了一个标题行,您正在跳过它,对不起,我的错误。虽然OP的输入文件没有标题行@RiggsFolly我试过了,但输入真的很奇怪。我需要它是partid,[1]=>descr我尝试了所有我知道的
foreach
可能性,但没有任何东西能够正确检索数据。你能帮我吗?我的意思是我需要在数组中循环并执行一些查询,但是当我使用普通的
foreach
然后尝试value[key]时,我没有得到我需要的值抱歉,我没有看到你的回音。太好了,谢谢!我想我只是把它复杂化了。我尝试了我所知道的每一种可能性,但都没有正确地检索数据。你能帮我吗?我的意思是我需要在数组中循环并执行一些查询,但是当我使用普通的
foreach
然后尝试value[key]时,我没有得到我需要的值抱歉,我没有看到你的回音。太好了,谢谢!我想我只是把它复杂化了。