在将CSV加载到MySQL之前快速修改CSV

b5buobof  于 2023-01-10  发布在  Mysql
关注(0)|答案(2)|浏览(141)

我正在尝试加载一个CSV文件到我的MYSQL数据库中,但是在此之前我需要稍微修改一下。CSV文件是以管道分隔的(|)我在CSV文件中有一个名为Party:Identification的列。该列包含诸如“a:hello,B:hi c:151 ......”之类的结果。这可以无限地继续下去。我只需要获取c的值。我已经想出了一个适用于此的方法,但是我在如何在将文件插入数据库之前修改值方面遇到了麻烦。
我试着用“”替换标题中的所有“:“,然后使用.transform修改值,但是这似乎没有改变列中的值,只改变了标题。代码附在下面。

csv.parseFile(req.file.path, {
        headers: headers => headers.map(function (header) {
            const newHeaders = header.replaceAll(" ", "").replaceAll(":", "")
            console.log(newHeaders)
            return newHeaders
        }),
        delimiter: '|'
    })
        .transform(function(data) {
            console.log(data)
            PartyIdentification: getPartyID(data.partyIdentification)
        })
        .on("error", (err) => console.error(err))
        .on("finish", function () {
            query("LOAD DATA LOCAL INFILE '" +
                file +
                "' INTO TABLE table " +
                " FIELDS TERMINATED BY '|'" +
                " LINES TERMINATED BY  '\n'" +
                " IGNORE 1 ROWS;").then(r =>
                console.log(file)
            )
        })


function getPartyID(str) {
    if (str === undefined) return ""
    const split = str.split(",")
    const value = split.find(val => {
        return val.includes("c")
    })
    if(value === undefined) return ""
    return (value.split(":")[1].trim())
}
2sbarzqh

2sbarzqh1#

可以使用正则表达式解析字符串中c:123的值:

function getPartyID(str) {
  if (str === undefined) return "";
  const m = str.match(/\bc:([^ ]*)/); 
  return m ? m[1] : null;
}

[
  "a:hello, b:hi c:151 d:foo",
  "a:hello, b:no_c",
].forEach(str => {
  console.log(str, '==>', getPartyID(str));
});

输出:

a:hello, b:hi c:151 d:foo ==> 151
a:hello, b:no_c ==> null

正则表达式的解释:

  • \b-字边界
  • c:--文本
  • ([^ ]*)-具有值的捕获组1,最大值不包括空格
1hdlvixo

1hdlvixo2#

在加载之前,不要麻烦修复csv文件,只需在LOAD它的时候丢弃不需要的列。
例如,这将仅加载第3列:

LOAD DATA ...
    (@a, @b, c_col, @d, @e, ...)

也就是说,将不需要的列捕获到@variables中,然后忽略它们。
如果需要在存储到表中之前删除c:,则

LOAD DATA ...
    (@a, @b, @c, @d, @e, ...)
    SET c_c0l = mid(@c, 3)

(or任何表达式都可以。如果它能更好地工作,也可以参见SUBSTRING_INDEX。)
即使在这种浪费的模式下,LOAD DATA也足够快了,而且你的编码也少了很多。

相关问题