如何将非csv - delimited ASCII数据导入SQLite 3?



如何将非csv的ASCII数据导入SQLite 3?

我有大量的换行符(0x0A)结束的ASCII数据,我想导入到SQLite 3。我不能使用CSV格式,因为许多文本字段都嵌入了逗号和引号。我可以以任何方式重新格式化数据,但我宁愿不重新格式化为SQL插入语句(超过4亿行)。

我想使用"。import"命令,它应该支持"ascii"格式,其中使用0x1F列分隔符和0x1E行分隔符。不知何故,它不起作用。我一直收到"预期120列",但发现只有1列。

我得到的所有谷歌结果都是关于CSV导入的,这就是我在这里问的原因。

我在下面附上了我的问题的一个简化的例子。如前所述,示例数据可以包含引号(单引号和双引号)、制表符和逗号,因此我不能使用它们作为分隔符。我可以使用任何其他字节值作为列和行分隔符。

的例子。表

create table testtable ( item char(20), descr char(30), misc char(40) );

数据
misc没有"other"注释,目前是的,我喜欢葡萄

我通读了SQLite3论坛,偶然发现了这个解决方案,它并没有真正完整地记录下来。

ascii功能是无用的/不工作。

-- First, I clear my test table
delete from testtable;
-- specify the column delimiter character. I used x1F 36.
-- newline  remains as the record separator (visually easier)
.separator 36
-- import away
.import xxtestdat testtable 
-- verify the load 
.headers on
.mode column
select * from testtable;

Background

如果CSV分别有(,,n)用于awk命名的字段和记录分隔符,或列和行分隔符,Sqlite的.import --ascii [file] [db]期望(x37,x36)是标准的ASCII单位分隔符(us)和记录分隔符(rs)。参考man ascii或其他参考

演示

使用seq 9 | rs -C, 3 | sed 's/,$//' | tee seq.csv获取一个普通的CSV示例,注意没有尾列分隔符。

<seq.csv tr ',' '37' | tr 'n' '36' | tee seq.ascii | less -RF分别将CSV的行分隔符和列分隔符转换为ASCII的单位分隔符和记录分隔符。

sqlite3 seq.db '.import --ascii seq.ascii tbl'imports.

sqlite3 seq.db '.dump tbl'显示导入的表。

其他提示在sqlite中,如果.import之前的表不存在,第一行将成为标题。表需要列名

在处理其他大文件时,less -R,head -c [char #s]vim可能是您的朋友,可以修改这些文件并预览更改。

我发现引用比我想要理解的更挑剔。Bash或命令在某些上下文中解释转义序列。tr正确接受$'x1f''37',但不接受"x1f"。注意tr接受多字符参数,所以引用是必要的,tr , x1ftr , 'x1f'是有区别的。Gnu-sed增加了后期的解释。

其他选定参考文献

$ printf "3637 x1ex1f" | xxd
00000000: 1e1f 201e 1f                             .. ..

fromman ascii

  • 八进制:

    034 fs 035 gs 036 rs 037 us

  • 十六进制:
  • 1c fs 1d gs 1e rs 1f us.

Sqlite还允许指定其他列分隔符和可选的行分隔符。.separator COL ?ROW? Change the column and row separators

最新更新