【问题标题】:Using sqlite3 How to set the width of one column in a SQL-db (or its CSV)使用 sqlite3 如何在 SQL-db(或其 CSV)中设置一列的宽度
【发布时间】:2023-03-20 17:11:01
【问题描述】:

对此感到绝望:

我尝试将 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 在创建数据库之前、期间或之后这样做?

【问题讨论】:

  • left(<your string>, 7) 或同等学历。这取决于您正在使用的 DBMS(是什么?)。
  • 谢谢。我正在使用 DB-Browser for SQLite (Mac OS)。我使用 CSV 文件中的 sqlite3 终端 cmd 创建数据库
  • 考虑编辑您的问题并添加适当的 sqlite 标签。对于 SQLite,等效值为 substr(<your string>, 1, 7)。在将它们插入表之前,您需要将其应用于这些值。我不能告诉你你是怎么做到的,因为我不知道你在那里使用的程序。但也许你可以自己解决这个问题,而且这个提示还是很有价值的。
  • 我添加了更多关于数据库创建过程的信息。您能否详细告诉我,我将如何以及在何处添加您的substr(<your string>, 1, 7)??

标签: sql database csv width


【解决方案1】:

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

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

注意:不确定 SUBSTR() 函数的语法。最好google一下。

【讨论】:

    【解决方案2】:

    也许不是最有效的方法,但由于我不知道该工具,所以我能看到的唯一一个:

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

    2. 之后,更新表格以修剪文本。例如,如果您要缩短的文本是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?顾名思义。

    【讨论】:

    • 感谢您的帮助。我的最终解决方案采用了 maxim 的解决方案 - 不是因为他的解决方案比你的好,而是因为你提到的主键原因!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2012-09-30
    • 2013-09-12
    • 1970-01-01
    • 2021-10-08
    • 2014-01-19
    • 1970-01-01
    相关资源
    最近更新 更多