You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在使用fgetcsv拆分前移除CSV数字中的千位分隔逗号?

解决方案

你的核心问题是:fgetcsv已经将CSV行拆分为数组后,再处理字段内的千位分隔逗号,且原有正则无法处理多段千位分隔的数字(比如1,730,197.34)。以下是两种可行的实现方式:

方式一:读取数组后逐个清理字段

先通过fgetcsv正确读取带引号的字段,再遍历每个字段,精准移除数字中的千位逗号:

while (($row = fgetcsv($file, 1000, ",")) !== FALSE) {
    print("<br><b>Before</b><br>");
    print_r($row);
    
    // 遍历每个字段,只移除数字之间的逗号
    foreach ($row as &$field) {
        // 正则匹配:仅逗号前后都是数字时才移除,避免误删文本中的逗号
        $field = preg_replace('/(?<=\d),(?=\d)/', '', $field);
    }
    unset($field); // 释放引用,避免后续变量污染
    
    print("<br><b>After</b><br>");
    print_r($row);
    $Symbol = $row[0];
}

方式二:先清理整行再拆分

先读取完整行文本,移除所有数字间的千位逗号后,再用str_getcsv解析为数组:

while (($line = fgets($file)) !== FALSE) {
    print("<br><b>Original Line</b><br>");
    echo htmlspecialchars($line);
    
    // 全局移除数字之间的千位分隔逗号
    $processedLine = preg_replace('/(?<=\d),(?=\d)/', '', $line);
    
    print("<br><b>Processed Line</b><br>");
    echo htmlspecialchars($processedLine);
    
    // 解析处理后的行
    $row = str_getcsv($processedLine);
    
    print("<br><b>After Parsing</b><br>");
    print_r($row);
    $Symbol = $row[0];
}

关键说明

  • 正则/(?<=\d),(?=\d)/:通过正向断言确保仅匹配数字中间的逗号,不会误删字段分隔符或文本中的逗号。
  • 避免直接用str_replace(',', '', $field):这种方式会删除字段内所有逗号,若公司名称等文本字段包含逗号会导致数据损坏。

内容的提问来源于stack exchange,提问作者Volatil3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:31:58