使用sqlite3如何设置SQL db(或其CSV)中一列的宽度

使用sqlite3如何设置SQL db(或其CSV)中一列的宽度,sql,database,csv,width,Sql,Database,Csv,Width,对此感到绝望: 我尝试将SQL表中一个特定列的宽度限制为7个字符宽。更准确地说,我希望将列中的每个元素修剪为宽度最多为7个字符的文本元素(如果更长,则应将其截断) 另一种可能是在创建SQL db之前更改相应CSV列中的字符数 问题是:数据库太大了 (因此,使用最常用的工具(如Sublime、Atom或Excel)无法更改CSV(在创建SQL-DB之前) 还有什么替代方案?(可能是sqlite3或某些终端命令??) 我的CSV文件(table1.txt)如下所示: some_text,some_i

对此感到绝望:

我尝试将SQL表中一个特定列的宽度限制为7个字符宽。更准确地说,我希望将列中的每个元素修剪为宽度最多为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 terminal cmd创建数据库:

sqlite3 myTable.db > creationFile.sql`

现在,CSV文件中已经引入了列宽限制。但我认为这是不可能的,因为由于CSV文件的大尺寸(超过10百万行),没有标准编辑器再这样做了。sqlite3有没有办法在数据库创建过程中处理这个问题?或者在DB创建之前、期间或之后执行此操作的任何终端cmd???

可能不是最有效的方法,但由于我不知道该工具,我只能看到:

  • 创建数据库并导入所有全文长度的数据。因为您的列类型是
    text
    ,应该适用于任何文本长度

  • 之后,更新表格以修剪文本。例如,如果要缩短的文本是列
    stop\u name\u text
    的文本:

    UPDATE table1
           SET stop_name_text = substr(stop_name_text, 1, 7);
    
    但是要小心,当你想对
    某些文本
    执行此操作时:你将其声明为
    主键
    。缩短可能会导致在不同的列中出现两个相同的文本。例如,如果你有“Hello World”和“Hello Walter”,这两个词都会导致“Hello W”。但是声明的
    主键
    列的值必须是唯一的,因此在这种情况下,
    更新
    将失败

    或者,这可能是一个错误,您实际上想将
    某个id
    声明为
    主键
    ?顾名思义


  • 也许不是最有效的方法,但由于我不知道工具,我只能看到:

  • 创建数据库并导入所有全文长度的数据。因为您的列类型是
    text
    ,应该适用于任何文本长度

  • 之后,更新表格以修剪文本。例如,如果要缩短的文本是列
    stop\u name\u text
    的文本:

    UPDATE table1
           SET stop_name_text = substr(stop_name_text, 1, 7);
    
    但是要小心,当你想对
    某些文本
    执行此操作时:你将其声明为
    主键
    。缩短可能会导致在不同的列中出现两个相同的文本。例如,如果你有“Hello World”和“Hello Walter”,这两个词都会导致“Hello W”。但是声明的
    主键
    列的值必须是唯一的,因此在这种情况下,
    更新
    将失败

    或者,这可能是一个错误,您实际上想将
    某个id
    声明为
    主键
    ?顾名思义


  • 你可以试试这个。创建表1后运行以下语句:

    CREATE TABLE table2 AS
      SELECT some_text, SUBSTR(some_id, 1, 7) as some_id, stop_name
      FROM table1;
    

    注意:不确定SUBSTR()函数的语法。最好用谷歌搜索一下。你可以试试这个。创建表1后运行以下语句:

    CREATE TABLE table2 AS
      SELECT some_text, SUBSTR(some_id, 1, 7) as some_id, stop_name
      FROM table1;
    

    注意:不确定SUBSTR()函数的语法。最好用谷歌搜索它。

    左(,7)
    或同等工具。这取决于您使用的DBMS(哪个是?),谢谢。我正在使用SQLite的DB浏览器(Mac OS)。我从CSV文件中创建了带有sqlite3 terminal cmd的DB,考虑编辑您的问题并添加适当的sqlite标记。对于SQLite,等价物是
    substr(,1,7)
    。在将值插入表之前,需要将其应用于这些值。我不能确切地告诉你你是如何做到这一点的,因为我不知道你在那里使用的程序。但是,也许你自己能弄明白,这仅仅是一个提示,无论如何都是有价值的。我添加了更多关于DB创建过程的信息。请您更详细地告诉我如何以及在何处添加您的
    substr(,1,7)
    确切地说???
    left(,7)
    或同等内容。这取决于您使用的DBMS(哪个是?),谢谢。我正在使用SQLite的DB浏览器(Mac OS)。我从CSV文件中创建了带有sqlite3 terminal cmd的DB,考虑编辑您的问题并添加适当的sqlite标记。对于SQLite,等价物是
    substr(,1,7)
    。在将值插入表之前,需要将其应用于这些值。我不能确切地告诉你你是如何做到这一点的,因为我不知道你在那里使用的程序。但是,也许你自己能弄明白,这仅仅是一个提示,无论如何都是有价值的。我添加了更多关于DB创建过程的信息。您能详细告诉我如何以及在哪里添加您的
    substr(,1,7)
    吗?谢谢您的帮助。我的最终解决方案与maxim的解决方案一致——不是因为他的解决方案比你的好很多,而是因为你提到的主键的原因!!谢谢你的帮助。我的最终解决方案与maxim的解决方案一致——不是因为他的解决方案比你的好很多,而是因为你提到的主键的原因!!