我创建了一个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);
您可以看到 row
内部的键rando
被双引号括起来
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);
};
};
我发现最后一个键中留下了一个返回字符。
在控制台中:
keys
>(3) ["accountId", "nickname", "rando"]
JSON.strigify(keys)
>"["accountId","nickname","randor"]"
解决方法是删除返回字符
const results = [];
const lines = reader.result.split('n');
const header = lines.shift().replace(/(rn|n|r)/gm, ''); //Remove newline characters
const keys = header.split(',');
forEach((line) => {
const values = line.replace(/(rn|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);