使用Node.js正则表达式去除CSV文件中的\n和\r
解决CSV解析为数组的问题
看起来你遇到的核心问题是这份CSV数据的格式有缺陷——相邻城市的最后一个经度字段和下一个城市名之间没有用逗号分隔,而是直接用空格连在了一起(比如2.349014 Marseille),直接用.split(',')会把这类内容当成单个元素,导致解析出错。我来帮你一步步解决:
步骤1:先修复CSV格式问题
我们可以用正则表达式把粘在一起的经度 城市名替换成经度,城市名,先把数据格式修正过来。正则的思路是匹配「带小数点的数字 + 空格 + 大写开头的单词」(你的城市名都是首字母大写的单单词,刚好符合这个规则):
// 你的原始CSV字符串 const rawCsv = "Paris,2138551,5.272,1,138,900,48.864716,2.349014 Marseille,794811,1.959,423,439,43.29695,5.38107 Lyon,472317,1.164,251,730,45.74846,4.84671 Toulouse,433055,2.135,230,826,43.60426,1.44367 Nice,338620,1.669,180,545,43.675819,7.289429 Nantes,277269,1.367,147,879,47.21725,-1.55336"; // 修复分隔问题:把"经度 城市名"替换成"经度,城市名" const fixedCsv = rawCsv.replace(/(\d+\.\d+) ([A-Z][a-z]+)/g, "$1,$2");
步骤2:分割为一维数组
格式修复后,直接用.split(',')就能得到每个字段单独的一维数组:
const csvArray = fixedCsv.split(','); console.log(csvArray); // 输出示例:["Paris", "2138551", "5.272", ..., "2.349014", "Marseille", ...]
步骤3(可选):按城市分组为二维数组
如果需要把每个城市的8个字段(城市名、人口、密度、...、纬度、经度)单独分组,可以进一步处理:
const citiesArray = []; // 每个城市固定8个字段,所以每8个元素为一组 for (let i = 0; i < csvArray.length; i += 8) { citiesArray.push(csvArray.slice(i, i + 8)); } console.log(citiesArray); // 输出示例: // [ // ["Paris", "2138551", "5.272", "1", "138", "900", "48.864716", "2.349014"], // ["Marseille", "794811", "1.959", "423", "439", "43.29695", "5.38107"], // ... 其他城市条目 // ]
小提示
如果你的CSV后续会出现多单词的城市名(比如New York),上面的正则需要调整,但从你提供的示例数据来看,所有城市都是单单词,这个方案完全适用。
内容的提问来源于stack exchange,提问作者M. Mez
相关产品推荐
相关产品推荐

