如何将非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) );
数据我通读了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 , x1f
和tr , 'x1f'
是有区别的。Gnu-sed增加了后期的解释。
其他选定参考文献
$ printf "