javascript - Node.js CSV 解析器 - 列错误 -> 将多个数组组合成一个对象?
问题描述
首先,我使用 Node.js 的 CSV 解析器
首先这段代码:
const parse = require("csv-parse/lib/sync");
const fs = require("fs");
const filePath = req.file.path;
const csvContent = fs.readFileSync(filePath);
const records = parse(csvContent, {
columns: false,
skip_empty_lines: true,
skip_lines_with_error: true,
delimiter: ";"
});
现在我遇到的问题是,如果列为真,则不会解析相等的列名。如果列为真,则控制台中的结果为:
const records = parse(csvContent, {
columns: true,
[ { Referenz: 'Beispielwert1',
Client: 'Beispielwert2',
Clienthauptgruppe: 'Beispielwert3',
Kontrahent: 'Beispielwert4',
Kontrahentenhauptgruppe: 'Beispielwert5',
Bank: 'Beispielwert6',
Back_to_Back: 'Beispielwert7',
Int_Ext: 'Beispielwert8',
Valuta: 'Beispielwert9',
Geschaeftsart: 'Beispielwert10',
Kauf_Verkauf: 'Beispielwert11',
Wrg: 'Beispielwert12',
Diff_In_Hauswaehrung: 'Beispielwert13,
Hauswaehrung: 'Beispielwert14',
Marktwert_NPV: 'Beispielwert5' },
{ Referenz: 'Beispielwert1',
Client: 'Beispielwert2',
Clienthauptgruppe: 'Beispielwert3',
Kontrahent: 'Beispielwert4',
Kontrahentenhauptgruppe: 'Beispielwert5',
Bank: 'Beispielwert6',
Back_to_Back: 'Beispielwert7',
Int_Ext: 'Beispielwert8',
Valuta: 'Beispielwert9',
Geschaeftsart: 'Beispielwert10',
Kauf_Verkauf: 'Beispielwert11',
Wrg: 'Beispielwert12',
Diff_In_Hauswaehrung: 'Beispielwert13,
Hauswaehrung: 'Beispielwert14',
Marktwert_NPV: 'Beispielwert5' }]
如果列为假,则控制台中的结果为:
const records = parse(csvContent, {
columns: false,
[ [ 'Referenz',
'Client',
'Clienthauptgruppe',
'Kontrahent',
'Kontrahentenhauptgruppe',
'Bank',
'Back_to_Back',
'Int_Ext',
'Valuta',
'Geschaeftsart',
'Kauf_Verkauf',
'Wrg',
'Diff_In_Hauswaehrung',
'Hauswaehrung',
'Marktwert_NPV'
'Wrg'],
[ 'Beispielwert1',
'Beispielwert2',
'Beispielwert3',
'Beispielwert4',
'Beispielwert5',
'Beispielwert6',
'Beispielwert7',
'Beispielwert8',
'Beispielwert9',
'Beispielwert10',
'Beispielwert11',
'Beispielwert12',
'Beispielwert13',
'Beispielwert14',
'Beispielwert15'
'Beispielwert16' ],
[ 'Beispielwert1',
'Beispielwert2',
'Beispielwert3',
'Beispielwert4',
'Beispielwert5',
'Beispielwert6',
'Beispielwert7',
'Beispielwert8',
'Beispielwert9',
'Beispielwert10',
'Beispielwert11',
'Beispielwert12',
'Beispielwert13',
'Beispielwert14',
'Beispielwert15'
'Beispielwert16' ]]
例如,这里的列 Wrg 是双列,如果列位于:true.. 它不存在
现在,如果列为真,我希望再次使用与上述相同的形式。但是如果多个数组位于一个变量(记录)中,我如何将多个数组放入一个对象?
最好的祝福
弗雷德里克
解决方案
我们可以重新映射每一行的值,用唯一的数字更新任何重复的字段。例如,这会将“Wrg”更改为“Wrg2”。您还可以映射到单个列,而不是显示字段数组,我在下面包含了两种方法:
const parse = require("csv-parse/lib/sync");
const fs = require("fs");
const filePath = req.file.path;
const csvContent = fs.readFileSync(filePath);
let records = parse(csvContent, {
delimiter: ";",
skip_empty_lines: true,
skip_lines_with_error: true,
});
function getFieldNameArray(row) {
return row.reduce((fieldNames, originalFieldName) => {
let fieldName = originalFieldName;
let uniqifier = 1;
while (fieldNames.includes(fieldName)) {
fieldName = `${originalFieldName}${++uniqifier}`; // You could use a different algorithm for this purpose.. e.g. use field_duplicate etc..
}
fieldNames.push(fieldName);
return fieldNames;
}, []);
}
const fieldNames = getFieldNameArray(records[0]);
records = records.slice(1).map((currentRow, index) => {
return currentRow.reduce((prev, value, index) => {
prev[fieldNames[index]] = value;
return prev;
}, {});
}, records)
console.log(records);
我得到这样的输出:
[ { Referenz: 'Beispielwert1',
Client: 'Beispielwert2',
Clienthauptgruppe: 'Beispielwert3',
Kontrahent: 'Beispielwert4',
Kontrahentenhauptgruppe: 'Beispielwert5',
Bank: 'Beispielwert6',
Back_to_Back: 'Beispielwert7',
Int_Ext: 'Beispielwert8',
Valuta: 'Beispielwert9',
Geschaeftsart: 'Beispielwert10',
Kauf_Verkauf: 'Beispielwert11',
Wrg: 'Beispielwert12',
Diff_In_Hauswaehrung: 'Beispielwert13',
Hauswaehrung: 'Beispielwert14',
Marktwert_NPV: 'Beispielwert15',
Wrg2: 'Beispielwert16' }
]
如果您希望在“Wrg”下创建一个值数组,这应该可以:
const parse = require("csv-parse/lib/sync");
const fs = require("fs");
const filePath = req.file.path;
const csvContent = fs.readFileSync(filePath);
let records = parse(csvContent, {
delimiter: ";",
skip_empty_lines: true,
skip_lines_with_error: true,
});
let fieldNames = Object.values(records[0]);
records = records.slice(1).map((currentRow) => {
return currentRow.reduce((prev, value, index) => {
if (!prev.hasOwnProperty(fieldNames[index])) {
prev[fieldNames[index]] = value;
} else {
let existing = prev[fieldNames[index]];
prev[fieldNames[index]] = (Array.isArray(existing) ? existing: [existing]).concat(value);
}
return prev;
}, {});
})
console.log(records);
我得到这样的输出:
[ { Referenz: 'Beispielwert1',
Client: 'Beispielwert2',
Clienthauptgruppe: 'Beispielwert3',
Kontrahent: 'Beispielwert4',
Kontrahentenhauptgruppe: 'Beispielwert5',
Bank: 'Beispielwert6',
Back_to_Back: 'Beispielwert7',
Int_Ext: 'Beispielwert8',
Valuta: 'Beispielwert9',
Geschaeftsart: 'Beispielwert10',
Kauf_Verkauf: 'Beispielwert11',
Wrg: [ 'Beispielwert12', 'Beispielwert16' ],
Diff_In_Hauswaehrung: 'Beispielwert13',
Hauswaehrung: 'Beispielwert14',
Marktwert_NPV: 'Beispielwert15' },
]
推荐阅读
- xamarin - 无法在 Live Player 中运行全新的 Xamarin 表单
- server - 在 WSO2 IS 中启用 TOTP 的 CURL 请求出错
- node.js - 使用文件扩展名 e2e.js 进行排毒模拟
- java - 我应该向 Unirest Api 添加哪些标头以让我的服务器接受我的请求?
- docker - docker dns 用于一组正在运行的容器
- ros - 如何仅使用 pcl 1.8 将 ros PointCloud2 转换为 pcl Pointcloud2?
- java - 2018年Yahoomail Imap登录
- javascript - 使用 onfocus 从其他值计算表单字段输入值
- r - 如何从 R 中的箱线图中提取 y 轴标签?
- unity3d - Unity2d 每个对象都是不可见的