如何设置分隔符,Postgresql

时间:2015-06-19 19:10:42

标签: postgresql csv collation

我想知道这个.csv文件的分隔符是什么。我试图通过COPY FROM语句导入.csv,但不知怎的,它总是抛出一个错误。当我将分隔符更改为E' \ t'它会抛出一个错误。当我将分隔符更改为' |'它抛出了一个不同的错误。我一直试图导入一个愚蠢的.csv文件3天,我无法取得成功。 我真的需要你的帮助。这是我的.csv文件:Download here, please

我在postgresql上的代码如下所示:

CREATE TABLE movie
(
 imdib  varchar NOT NULL,
 name varchar NOT NULL,
 year integer,
 rating float ,
 votes integer,
 runtime varchar  ,
 directors varchar ,
 actors varchar ,
genres varchar
);

MY COPY声明:

COPY movie FROM '/home/max/Schreibtisch/imdb_top100t_2015-06-18.csv' (DELIMITER E'\t', FORMAT CSV, NULL '', ENCODING 'UTF8');

当我使用SHOW SERVER_ENCODING时,它会说" UTF8"。但是为什么地狱后不能从列中读取数据呢?我真的不明白。我使用Ubuntu 64位,.csv文件具有所需的所有权限,postgresql也有。请帮我。 这些是我的错误:

  

错误:列"名称"缺少数据   背景:复制电影,第1行:" tt0468569,黑暗骑士,2008,9,1440667,152分钟,Christopher Nolan,Christian Bale | Heath Ledger | Aar ......"

**********错误**********

  

错误:列"名称"缺少数据   SQL状态:22P04   背景:COPY电影,第1行:" tt0468569,黑暗骑士,2008,9,1440667,152分钟,Christopher Nolan,Christian Bale | Heath Ledger | Aar ......"

2 个答案:

答案 0 :(得分:1)

以下适用于我:

COPY movie (imdib,name,year,rating,votes,runtime,directors,actors,genres) 
    FROM 'imdb_top100t_2015-06-18.csv' 
    WITH (format csv, header false, delimiter E'\t', NULL '');

不幸的是,该文件无效,因为在第12011行,year列包含值2015 Video,因此导入失败,因为无法将其转换为整数。然后进一步向下(第64155行),评级无效值NA,无法转换为浮动,然后再转换为投票。

但是如果您创建包含所有varchar列的表,则上述命令对我有效。

答案 1 :(得分:1)

使用此代码代替它在Linux上以及Windows上正常工作

\COPY movie(imdib,name,year,rating,votes,runtime,directors,actors,genres) FROM 'D:\test.csv' WITH DELIMITER '|' CSV HEADER;

还有一件事在你的csv文件中插入标题,如下所示:

imdib|name|year|rating|votes|runtime|directors|actors|genres
tt0111161|The Shawshank Redemption|1994|9.3|1468273|142 mins.|Frank Darabont|Tim Robbins|Morgan Freeman

并使用单字节分隔符,如',','|'等

希望这对你有用..!