【问题标题】:Node.js CSV-parser - columns false -> group several arrays into one object?Node.js CSV-parser - columns false -> 将几个数组组合成一个对象?
【发布时间】:2019-09-20 17:53:23
【问题描述】:

首先,我使用 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.. 它不存在

现在,如果列为真,我希望再次使用与上述相同的形式.. 但是如果多个数组在一个变量(记录)中,我如何将多个数组放入一个对象?

最好的问候

弗雷德里克

【问题讨论】:

  • 我建议将您需要的结果添加到您的问题中,是这样的:{ 'Referenz': ['Beispielwert1','Beispielwert1','Beispielwert1'], 'Client': [' Beispielwert2','Beispielwert2','Beispielwert2'] ...谢谢!
  • 我需要的结果是如果列是“真”但例如双列 Wrg 不存在时我得到的结果。因此我需要相同的结构但现在使用双列..而且我认为无法避免重建,因为只有当列为“假”时,双列才存在。
  • 啊,是的,谢谢……我现在明白了!

标签: javascript node.js


【解决方案1】:

我们可以重新映射每一行的值,用唯一的数字更新任何重复的字段。例如,这会将“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' },
]

【讨论】:

  • 谢谢!重复是什么意思?我认为'重复!由于列名相等,问题会再次出现
  • 是的,我认为你是对的.. 其他方法在任何情况下都会很好地工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 2017-02-04
  • 2016-06-30
  • 2019-05-28
相关资源
最近更新 更多