我正在尝试加载一个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())
}
2条答案
按热度按时间2sbarzqh1#
可以使用正则表达式解析字符串中
c:123
的值:输出:
正则表达式的解释:
\b
-字边界c:
--文本([^ ]*)
-具有值的捕获组1,最大值不包括空格1hdlvixo2#
在加载之前,不要麻烦修复csv文件,只需在
LOAD
它的时候丢弃不需要的列。例如,这将仅加载第3列:
也就是说,将不需要的列捕获到@variables中,然后忽略它们。
如果需要在存储到表中之前删除
c:
,则(or任何表达式都可以。如果它能更好地工作,也可以参见
SUBSTRING_INDEX
。)即使在这种浪费的模式下,
LOAD DATA
也足够快了,而且你的编码也少了很多。