我创建了一个CSV解析器并遇到了一个有趣的情况。当命中onLoad函数时,我的对象row
的最后一个键被双引号。我正在寻找原因的解释。有人知道吗?
评论包含示例值
const results = [];
const lines = reader.result.split('\n');
//lines = ["accountId,nickname,rando", "test-arn,test-nickname,test-rando"]
const keys = lines[0].split(',');
//keys = ["accountId", "nickname", "rando"]
forEach((line) => {
// line = "test-arn, test-nickname, test-rando"
const values = line.split(',');
// values = ["test-arn", "test-nickname", "test-rando"]
const row = {};
for (let i = 0; i < keys.length; i++) {
let key = keys[i];
row[key] = values[i];
}
//row = { accountId: "test-arn", nickname="test-nickname", "rando": "test-rando"}
results.push(row);
}, lines);
您可以看到rando
中的密钥row
被双引号括起来
row = {
accountId: "test-arn",
nickname: "test-nickname",
"rando": "test-rando",
}
示例CSV
accountId,nickname,rando^M
test-arn,test-nickname,test-rando^M
完整功能
const parseCsv = ({ file, before, onSuccess, onError }) => {
before();
const reader = new FileReader();
reader.readAsText(file);
reader.onload = () => {
const results = [];
const lines = reader.result.split('\n');
const keys = lines[0].split(',');
forEach((line) => {
const values = line.split(',');
const row = {};
for (let i = 0; i < keys.length; i++) {
let key = keys[i];
row[key] = values[i];
}
results.push(row);
}, lines);
onSuccess(results);
};
reader.onError = (error) => {
onError(error);
};
};
答案 0 :(得分:0)
我发现最后一个键中有一个返回字符。
在控制台中:
keys
>(3) ["accountId", "nickname", "rando"]
JSON.strigify(keys)
>"["accountId","nickname","rando\r"]"
解决方法是删除返回字符
const results = [];
const lines = reader.result.split('\n');
const header = lines.shift().replace(/(\r\n|\n|\r)/gm, ''); //Remove newline characters
const keys = header.split(',');
forEach((line) => {
const values = line.replace(/(\r\n|\n|\r)/gm, '').split(',');
const row = {};
for (let i = 0; i < keys.length; i++) {
row[keys[i]] = values[i];
}
results.push(row);
}, lines);
onSuccess(results);