使用 sqlite3 如何设置 SQL-db(或其 CSV)中一列的宽度
Using sqlite3 How to set the width of one column in a SQL-db (or its CSV)
对此感到绝望:
我尝试将 SQL-table 中某一特定列的宽度限制为 7 个字符宽。更准确地说,我希望trim列中的每个元素都是宽度最多为7个字符的文本元素(如果更长,则应将其截断)。
另一种可能性是在创建 SQL-db 之前更改相应 CSV 列中的字符数。
问题:数据库很大!!
(因此,使用 Sublime、Atom 或 Excel 等大多数常用工具无法更改 CSV(在 SQL-DB 创建之前))
有哪些选择? (可能是 sqlite3 或一些终端命令 ??)
我的 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 终端命令创建数据库:
sqlite3 myTable.db > creationFile.sql`
现在,列宽限制可能已经引入到 CSV 文件中了。但我认为这是不可能的,因为由于 CSV 文件的大小(> 10 Mio 行),标准编辑器不再这样做了。 sqlite3 有没有办法在数据库创建期间处理这个问题?或者在数据库创建之前、期间或之后执行此操作的任何终端 cmd ??
也许不是最有效的方法,但由于我不知道该工具,所以我只能看到一个:
创建您的数据库并以全文长度导入所有数据。由于您的列类型是 text
,因此适用于任何文本长度。
之后,将 table 更新为 trim 文本。例如,如果要缩短的文本是 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
?顾名思义。
你可以试试这个。在创建 table1 运行 这个语句之后:
CREATE TABLE table2 AS
SELECT some_text, SUBSTR(some_id, 1, 7) as some_id, stop_name
FROM table1;
注意:不确定 SUBSTR() 函数的语法。不如google吧
对此感到绝望:
我尝试将 SQL-table 中某一特定列的宽度限制为 7 个字符宽。更准确地说,我希望trim列中的每个元素都是宽度最多为7个字符的文本元素(如果更长,则应将其截断)。
另一种可能性是在创建 SQL-db 之前更改相应 CSV 列中的字符数。
问题:数据库很大!!
(因此,使用 Sublime、Atom 或 Excel 等大多数常用工具无法更改 CSV(在 SQL-DB 创建之前))
有哪些选择? (可能是 sqlite3 或一些终端命令 ??)
我的 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 终端命令创建数据库:
sqlite3 myTable.db > creationFile.sql`
现在,列宽限制可能已经引入到 CSV 文件中了。但我认为这是不可能的,因为由于 CSV 文件的大小(> 10 Mio 行),标准编辑器不再这样做了。 sqlite3 有没有办法在数据库创建期间处理这个问题?或者在数据库创建之前、期间或之后执行此操作的任何终端 cmd ??
也许不是最有效的方法,但由于我不知道该工具,所以我只能看到一个:
创建您的数据库并以全文长度导入所有数据。由于您的列类型是
text
,因此适用于任何文本长度。之后,将 table 更新为 trim 文本。例如,如果要缩短的文本是
列的文本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
?顾名思义。
你可以试试这个。在创建 table1 运行 这个语句之后:
CREATE TABLE table2 AS
SELECT some_text, SUBSTR(some_id, 1, 7) as some_id, stop_name
FROM table1;
注意:不确定 SUBSTR() 函数的语法。不如google吧