Php 如何在不同的行上划分用逗号分隔的数据
我有一个脚本,它从数据库中提取一个.csv文件,该文件保存用户登录的不同本地数据。.csv文件如下所示: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"
"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()
创建的寄存器没有正确地用“.”包装