昨天将此发布给Reddit,但没有爱。我在Centos上,编写bash脚本并解析数据以导入到mysql中。
我不得不将存储故事主要部分的故事档案转换为纯文本文件,并且需要能够将这些多行文本文件导入我的数据库中的列。我知道我可以使用mysqlimport,并且我将文件指定为管道分隔 - 但是因为我导入的文本文件中有回车符/换行符,所以它将每个段落作为自己的行导入。因此,当我使用mysqlimport时,9段文本文件将导入为9行。
有办法做到这一点吗?
我知道导入的理想文本文件(使用管道分隔符)就像(没有空白行):
这是我的记录| 12345
另一条记录| 24353
有另一个百吉饼,为什么不呢?| 43253
但是,我的文件实际上更接近于此:
这是我第一段的第一行。现在我要做更多的换行和填充。
这是来自同一文本文件的第二行,应该将其视为单个记录以及单个“blob”或文本字段中的第一行。 | 12345
这是从有人丢弃的软件中恢复的最后一块绊脚石,我希望能够做到这一点。我有14,000个这样的文本文件(每个都是这种格式),所以手工完成它们是不可能的。
答案 0 :(得分:0)
将新行编码/传输为'\ n',并将相同方式选项卡编码为'\ t'。当您将任何URL或原始文本存储到数据库中时,这是最佳做法。这也可以帮助你避免sql注入并解决你当前的问题......
如果有帮助,请告诉我。感谢。
答案 1 :(得分:0)
将行转换为sql语句时,我不知道性能。我认为它很有用:
输入
This is the first line of my first paragraph. And now I'm going to do some more line wrapping and stuff.
This is a second line from the same text file that should be treated as a single record along with the first line in a single "blob" or text field. |12345
I am hoping I understood the question correct.
Everything without a pipe is part of the first field.
And the line with a pipe is for field 1 and 2.
Like this one |12346
脚本
my_insert="INSERT INTO my_table
(field1, field2)
VALUES
('"
firstline=0
while read -r line; do
if [[ -z "${line}" ]]; then
printf "\n"
continue;
fi
if [[ "${firstline}" -eq 0 ]]; then
printf "%s" "${my_insert}"
firstline=1
fi
line_no_pipe=${line%|*}
if [[ "${line}" = "${line_no_pipe}" ]]; then
printf "%s\n" "${line}"
else
printf "%s',%s);\n" "${line_no_pipe}" "${line##*|}"
firstline=0
fi
done < input
输出
INSERT INTO my_table
(field1, field2)
VALUES
('This is the first line of my first paragraph. And now I'm going to do some more line wrapping and stuff.
This is a second line from the same text file that should be treated as a single record along with the first line in a single "blob" or text field. ',12345);
INSERT INTO my_table
(field1, field2)
VALUES
('I am hoping I understood the question correct.
Everything without a pipe is part of the first field.
And the line with a pipe is for field 1 and 2.
Like this one ',12346);