如何在使用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
相关产品推荐
相关产品推荐

