对此感到绝望:
我尝试将 SQL 表中一个特定列的宽度限制为 7 个字符宽。更准确地说,我想修剪列中的每个元素,使其成为宽度最多为 7 个字符的文本元素(如果更长,则应将其截断(。
另一种可能性是在创建 SQL-db 之前更改相应 CSV 列中的字符数。
问题:数据库很大!
(因此,使用大多数常用工具(如Sublime,Atom或Excel(无法更改CSV(在创建SQL-DB之前(
有哪些替代方案?(也许是sqlite3或一些终端cmd??
我的 CSV 文件 (table1.txt
( 看起来像:
some_text,some_id,stop_name
"Hello World1","1101069:0:1","MyName1"
"Hello World2","1333332","MyName2"
"Hello World3","1452339:0","MyName3"
"Hello World4","8334342:2:0","MyName4"
some_id列应限制为 7 个字符,从而导致...
some_text,some_id,stop_name
"Hello World1","1101069","MyName1"
"Hello World2","1333332","MyName2"
"Hello World3","1452339","MyName3"
"Hello World4","8334342","MyName4"
我的 sqlite3 创建文件 (creationFile.sql
( 看起来像这样:
CREATE TABLE table1 (some_text TEXT PRIMARY KEY, some_id TEXT, stop_name TEXT) WITHOUT ROWID;
.separator ,
.import table1.txt table1
我使用以下 sqlite3 终端 cmd 来创建数据库:
sqlite3 myTable.db > creationFile.sql`
现在,列宽限制可能已经在 CSV 文件中引入。但我认为这是不可能的,因为由于 CSV 文件的大小很大(> 10 行 Mio(,没有标准编辑器可以再这样做了。sqlite3 有没有办法在数据库创建过程中处理这个问题?或者任何终端cmd在创建数据库之前,期间或之后这样做?
你可以试试这个。创建table1后,运行以下语句:
CREATE TABLE table2 AS
SELECT some_text, SUBSTR(some_id, 1, 7) as some_id, stop_name
FROM table1;
注意:不确定 SUBSTR(( 函数的语法。最好用谷歌搜索一下。
也许不是最有效的方法,但由于我不知道该工具,我唯一可以看到的工具:
-
创建数据库并导入具有全文长度的所有数据。由于您的列类型
text
因此应该适用于任何文本长度。 -
之后,更新表格以修剪文本。例如,如果要缩短的文本是列的文本
stop_name_text
:UPDATE table1 SET stop_name_text = substr(stop_name_text, 1, 7);
但是要小心,当你想对
some_text
这样做时:你声明为PRIMARY KEY
。缩短可能会导致不同列中出现两个相同的文本。例如,如果您有"Hello World"和"Hello Walter",则都会导致"Hello W"。但是,声明PRIMARY KEY
列的值必须是唯一的,因此在这种情况下UPDATE
将失败。或者也许这是一个错误,你想实际上宣布
some_id
是PRIMARY KEY
?顾名思义。