替换 CSV 字符串中类似于分隔符的字符,但不是分隔符


Replace character in CSV-string that is LIKE the separator, but not THE separator

我在PHP中处理字符串时遇到了一点问题。

想象一个包含以下字段的 CSV 文件:

ItemID;ItemText;ItemVAT;ItemEAN;

显然,此字符串中的分隔符是 ";"。问题是,来自"ItemText"的值也可能包含";"。

我需要过滤这些字符串并将包含的";"替换为其他内容,例如"#"或"$",这无关紧要。我尝试用substr_count计算";"以确定我是否有额外的";"(与"正常"值字符串的计数相比)。但是我不知道如何在值中找到实际的";"。为了使事情变得更加困难,值字符串中可以有多个";"。

有人知道如何过滤这些不必要的";"?

如果您始终拥有此字段,则可以执行此类操作。

$line = "34;erwffw;wefweef;fwe3242;23342;53453;";
$toArray = explode(";", $line);
$counntSemi = count($toArray);
$newLine[0] = $toArray[0]; // ItemID
$newLine[1] = ''; // ItemText
$newLine[2] = $toArray[$counntSemi-3]; // ItemVAT
$newLine[3] = $toArray[$counntSemi-2]; // ItemEAN
// ItemText filter
for($i=1; $i < ($counntSemi-3); $i++) {
    $newLine[1] .= $toArray[$i]."@"; 
}
print_r($newLine);
// here you can implode this newLine with the semicolons

当字段包含分隔符时,应该用引号括起来,例如

valueA;"valueB;with;embedded;separators";valueC

如果是这种情况,例如,您可以将每个数组项与以下内容合并,同时它包含"字符的奇数nr。

如果文件的创建者(数据的编码器)没有遵循该规则,则没有通用的方法可以正确解码文件,因为对值"A"和"B"进行编码;C"将生成与编码值"A;B"和"C"。在这种情况下,您只能责怪创建者或尝试根据您拥有的模式识别 ItemVAT