Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Import 将可变列数导入SQLite数据库_Import_Sqlite - Fatal编程技术网

Import 将可变列数导入SQLite数据库

Import 将可变列数导入SQLite数据库,import,sqlite,Import,Sqlite,我有一个csv文件格式的同义词列表:word,meaning1,meaning2,meaning3…. 不同的单词有不同数量的同义词,这意味着行可能有不同数量的列。我正在尝试将csv文件导入sqlite数据库,如下所示: sqlite3 synonyms sqlite> create table list(word text, meaning0 text, meaning1 text, meaning2 text, meaning3 text, meaning4 text,

我有一个
csv
文件格式的同义词列表:
word,meaning1,meaning2,meaning3….

不同的单词有不同数量的同义词,这意味着行可能有不同数量的列。我正在尝试将csv文件导入sqlite数据库,如下所示:

    sqlite3 synonyms
    sqlite> create table list(word text, meaning0 text, meaning1 text, meaning2 text, meaning3 text, meaning4 text, meaning5 text, meaning6 text, meaning7 text, meaning8 text, meaning9 text);
sqlite> .mode list
sqlite> .separator ,
sqlite> .import ./csv/synonyms.csv list 
为了安全起见,我假设每个单词最多有10列。对于同义词少于10个的单词,其他列应为
null
。执行
import
命令时出现的错误是:

Error: ./csv/synonyms.csv line 1: expected 11 columns of data but found 3  
我的问题:
1.如果列数小于10,我如何告诉
SQLite
将其替换为
null

2.有没有办法指定我希望word后面有10列,而不是自动键入

您可以执行以下操作:

  • 将所有数据导入到单个列中
  • 更新将列内容拆分为其他列的表
样本:

-- Create a table with only one column;
CREATE TABLE table_name(first);
-- Choose a separator which doesn't exist within file
.separator ~
-- Import data
.import file.csv table_name

-- Add another column to split data
ALTER TABLE table_name ADD COLUMN second;
-- Split data between first and second column
UPDATE table_name SET first=SUBSTR(first, 1, INSTR(first, ",")-1), second=SUBSTR(first, INSTR(first, ",")+1) WHERE INSTR(first, ",")>0;

-- Repeat to next column
ALTER TABLE table_name ADD COLUMN third;
-- Split data between second and third column
UPDATE table_name SET second=SUBSTR(second, 1, INSTR(second, ",")-1), third=SUBSTR(second, INSTR(second, ",")+1) WHERE INSTR(second, ",")>0;

-- And so on...
ALTER TABLE table_name ADD COLUMN fourth;
UPDATE table_name SET third=SUBSTR(third, 1, INSTR(third, ",")-1), fourth=SUBSTR(third, INSTR(third, ",")+1) WHERE INSTR(third, ",")>0;

-- Many times as needed...

不是一种最佳方法,性能应该足够快。

错误:没有这样的函数
INSTR
。我在Mac电脑上。有什么解决方法吗?您使用的是
sqlite3
shell吗?哪个版本?SQLite 3.7.7 2011-06-25 16:35:41 8F8B373EED7052E6E93C1805FC1EFFCF1DB09366可以升级吗
INSTR
是在……中引入的,我从
sqlite
页面的下载页面下载了
sqlite3
shell。解压它会得到
sqlite3
shell。在
/usr/bin
中替换它是否有效,或者是否存在其他依赖项?