【问题标题】:Replace character in CSV-string that is LIKE the separator, but not THE separator替换 CSV 字符串中类似于分隔符但不是分隔符的字符
【发布时间】:2015-01-13 16:19:57
【问题描述】:

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

想象一个包含这些字段的 CSV 文件:

ItemID;ItemText;ItemVAT;ItemEAN;

很明显,这个字符串中的分隔符是“;”。问题是,来自“ItemText”的值可能也包含“;”。

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

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

【问题讨论】:

  • 除非您知道每个字段的格式,否则一般没有真正的方法可以做到这一点。我猜 ItemText 是唯一可以包含额外 ; 的字段?
  • 是的,ItemText 是唯一一个可以包含额外的;
  • 好的然后找到第一个;的索引。其后的下一个 k-4 分号是无关的,其中 k 是字符串中分号的数量。
  • 你可以做一个多于1个字符的分隔符|*| :)
  • 谢谢,我试试这个。 @Shibi 我从 API 获取这种格式的 CSV。我对使用的分隔符没有影响。

标签: php string csv substr


【解决方案1】:

如果你总是有这个字段,你可以这样做。

$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

【讨论】:

    【解决方案2】:

    当一个字段包含分隔符时,它应该被引用,例如

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

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

    如果文件的创建者(数据的编码器)没有遵循该规则,那么就没有正确解码文件的通用方法,因为对值“A”和“B;C”进行编码会产生相同的 csv 文件作为编码值“A;B”和“C”。在这种情况下,您只能责怪创建者或尝试根据您拥有的模式识别 ItemVAT

    【讨论】:

      猜你喜欢
      • 2017-07-24
      • 2021-10-25
      • 2013-02-08
      • 1970-01-01
      • 2023-02-25
      • 1970-01-01
      • 2013-09-20
      • 2014-02-10
      • 2010-10-19
      相关资源
      最近更新 更多