【发布时间】:2016-01-23 13:05:36
【问题描述】:
由于许多错误,我无法正确解析 CSV 文件。我提取了一个示例,您可以在这里下载:Test CSV File
主要错误(或产生错误的原因)是:
- 引号和逗号(尝试使用 R 解析文件时出现许多错误)
- 空行
- 字段内出现意外换行
我首先决定在将数据加载到 R 之前逐行使用正则表达式来清理数据,但无法解决问题,而且速度很慢(200Mo 文件)
所以我决定在 Node.js 下使用CSV parser,代码如下:
'use strict';
const Fs = require('fs');
const Csv = require('csv');
let input = 'data_stack.csv';
let readStream = Fs.createReadStream(input);
let option = {delimiter: ',', quote: '"', escape: '"', relax: true};
let parser = Csv.parse(option).on('data', (data) => {
console.log(data)
});
readStream.pipe(parser)
但是:
- 某些行被正确解析(字符串数组)
- 有些没有解析(所有字段都是一个字符串)
- 有些行仍然是空的(可以通过在选项中添加
skip_empty_lines: true来解决) - 我不知道如何处理意外的换行符。
我不知道如何使这个 CSV 变得干净,无论是使用 R 还是使用 Node.js。
有什么帮助吗?
编辑:
按照@Danny_ds 解决方案,我可以正确解析它。现在我无法正确地将其串回。
console.log(); 我得到了一个正确的对象,但是当我尝试对其进行字符串化时,我没有得到一个干净的 CSV(仍然有换行符和空行)。
这是我正在使用的代码:
'use strict';
const Fs = require('fs');
const Csv = require('csv');
let input = 'data_stack.csv';
let output = 'data_output.csv';
let readStream = Fs.createReadStream(input);
let writeStream = Fs.createWriteStream(output);
let opt = {delimiter: ',', quote: '"', escape: '"', relax: true, skip_empty_lines: true};
let transformer = Csv.transform(data => {
let dirty = data.toString();
let replace = dirty.replace(/\r\n"/g, '\r\n').replace(/"\r\n/g, '\r\n').replace(/""/g, '"');
return replace;
});
let parser = Csv.parse(opt);
let stringifier = Csv.stringify();
readStream.pipe(transformer).pipe(parser).pipe(stringifier).pipe(writeStream);
编辑 2:
这是最终的工作代码:
'use strict';
const Fs = require('fs');
const Csv = require('csv');
let input = 'data_stack.csv';
let output = 'data_output.csv';
let readStream = Fs.createReadStream(input);
let writeStream = Fs.createWriteStream(output);
let opt = {delimiter: ',', quote: '"', escape: '"', relax: true, skip_empty_lines: true};
let transformer = Csv.transform(data => {
let dirty = data.toString();
let replace = dirty
.replace(/\r\n"/g, '\r\n')
.replace(/"\r\n/g, '\r\n')
.replace(/""/g, '"');
return replace;
});
let parser = Csv.parse(opt);
let cleaner = Csv.transform(data => {
let clean = data.map(l => {
if (l.length > 100 || l[0] === '+') {
return l = "Encoding issue";
}
return l;
});
return clean;
});
let stringifier = Csv.stringify();
readStream.pipe(transformer).pipe(parser).pipe(cleaner).pipe(stringifier).pipe(writeStream);
谢谢大家!
【问题讨论】:
-
哇,这是一个搞砸的 CSV!您将需要分多个阶段对其进行修复。首先是修复似乎嵌入在某些行中的换行符。接下来,我将整理随机引用。如果您不希望数据中包含逗号,请删除引号。
-
您可以将 csv 文件上传到其他地方吗?要点可能
-
这里是另一个链接:Test CSV FIle
标签: javascript node.js parsing csv