Php 如何在不同的行上划分用逗号分隔的数据

Php 如何在不同的行上划分用逗号分隔的数据,php,csv,Php,Csv,我有一个脚本,它从数据库中提取一个.csv文件,该文件保存用户登录的不同本地数据。.csv文件如下所示: "id_user";"id_local" "1";"" "2";"2,3,4" "3";"" "5";"2,5" "10";"" "13";"2" "14";"5" "15";"2" "16";"1" "20";"2" "21";"" "id_user";"id_local" "2";"2" "2";"3 "2";"4" "5";"2" "5";"5" "13";"2" "14";"5"

我有一个脚本,它从数据库中提取一个.csv文件,该文件保存用户登录的不同本地数据。.csv文件如下所示:

"id_user";"id_local"
"1";""
"2";"2,3,4"
"3";""
"5";"2,5"
"10";""
"13";"2"
"14";"5"
"15";"2"
"16";"1"
"20";"2"
"21";""
"id_user";"id_local"
"2";"2"
"2";"3
"2";"4"
"5";"2"
"5";"5"
"13";"2"
"14";"5"
"15";"2"
"16";"1"
"20";"2"
正如您所能看到的,每个用户可以获得一个寄存器 但是,要正确地操纵它,我们需要这样:

"id_user";"id_local"
"1";""
"2";"2,3,4"
"3";""
"5";"2,5"
"10";""
"13";"2"
"14";"5"
"15";"2"
"16";"1"
"20";"2"
"21";""
"id_user";"id_local"
"2";"2"
"2";"3
"2";"4"
"5";"2"
"5";"5"
"13";"2"
"14";"5"
"15";"2"
"16";"1"
"20";"2"
因此,我需要创建一个函数来删除没有本地的用户,并在不同的寄存器中拆分同一用户的不同本地。有人知道我怎么做吗

以下是我目前掌握的代码,但我不确定我是否走上了正确的道路:

function fix_local_secundario(){
    $filename = "local_secundario.csv";
    $file_locais = file_get_contents($filename);
    $locais = explode("\n", $file_locais);
    // $pattern = "/,/";
    // $replacement = "\"\n;\"";
    while ($line = current($locais)) {
        $line = str_getcsv($line, ';', '"','\n');
        // $line = preg_replace($pattern, $replacement, $line);
        var_dump($line);
        echo "\n";
        next($locais);
    }

}

试试这个,看看是否有效:

function fix_local_secundario(){
    $filename = "local_secundario.csv";
    $file_locais = file_get_contents($filename);
    $locais = explode("\n", $file_locais);
    while ($line = current($locais)) {
        // do first split on ; character
        $arr1 = explode(";", $line);
        // if the part after ; is not empty for this line
        if ($arr1[1]!='""'){
            // split it further on , character
            $arr2 = explode(",", $arr1[1]);
            foreach ($arr2 as $key => $val){
                if($val[0] != '"'){
                    $val = '"'.$val;
                }
                if($val[strlen($val)-1] != '"'){
                    $val = $val . '"';
                }
                echo $arr1[0] . ";" . $val . "<BR>";
            }
        }
        next($locais);
    }
}
函数fix\u local\u secundario(){
$filename=“local_secundario.csv”;
$file\u locais=文件获取内容($filename);
$locais=爆炸(“\n”,$file\u locais);
而($line=当前($locais)){
//首先分开;分开
$arr1=分解(“;”,$line);
//如果后面的部分;对于此行不为空
如果($arr1[1]!='“”){
//再把它分开,角色
$arr2=爆炸(“,”,$arr1[1]);
foreach($arr2作为$key=>$val){
如果($val[0]!=“”){
$val=“”。$val;
}
如果($val[strlen($val)-1]!=“”){
$val=$val.“;
}
echo$arr1[0]。“;”$val。“
”; } } 下一个($locais); } }
一旦这个基本部分开始工作,您应该将其更改为返回值,而不是回显值,因为根据对您的问题所做的更新,此代码是函数的一部分。

$f = fopen("myfile.csv", "r");
while($row = fgetcsv($f, 0, ";")){
  $locals = explode(",", $row[1]);
  if (count($locals)>1){
    foreach($locals as $local)
      // iterate with $row[0] and $local
  }elseif($row[1] != "")
      // use $row[0] and $row[1]

}

您是否研究过php explode()函数?请看我对一个类似问题的回答:看看是否可以自定义此问题的解决方案。是否确实使用“\n”在引号内转义引号?特别是当你只能用一个字符逃跑时?@Maximus2012我试过用它,我会看看你的答案,看看我是否能适应it@MarkBaker这是因为我在终端而不是浏览器上测试它,但我改变了alreadynot,它返回同一行中的寄存器,但以“”而不是“”分隔我认为这只是一个小的格式问题。看看我对代码所做的更新。几乎就是这样!我还没有意识到为什么即使使用
,它也会一直显示空的=“”
ou
!isempty()
我认为您建议对这个答案进行的编辑使问题复杂化了。您可能希望首先使用代码测试更改,并对其进行相应的更改。目前我已将答案回滚到上一版本。已经对它们进行了测试,最后一次编辑是删除id为空的寄存器所必需的,因为从上一次
explode()
创建的寄存器没有正确地用“.”包装