2013-12-08 28 views
14

Tôi có một số tệp được lưu dưới dạng tsv. Tôi muốn chèn chúng vào một db postgresql, để phân tích chúng với sql.Chèn các tệp `tsv` vào postgresql db

Tuy nhiên, sự cố của tôi là cách INSERT tệp tsv này thành postgresql 9.2 dưới windows 7?

Tôi đánh giá cao câu trả lời của bạn!

PS .: Tôi đã tạo ra bảng với các giá trị đúng như:

CREATE TABLE ratings (distribution VARCHAR, votes VARCHAR, rank FLOAT, title VARCHAR);

tập tin trong thư mục:

C:/Users/testUser/Desktop/TSV/ratings.list.tsv

+1

tsv như trong vectơ tìm kiếm văn bản, hoặc bạn đã có nghĩa là csv như trong dấu phẩy giá trị được tách ra? Nếu sau này, hãy sử dụng COPY. –

+0

@Denis Thx cho câu trả lời của bạn. By tsv Tôi có nghĩa là các giá trị được phân cách bằng tab. Bạn có thể hiển thị ví dụ về cách sử dụng COPY trong câu lệnh sql không. – mrquad

Trả lời

13

Đối với các giá trị tách tab, bạn có thể sử dụng COPY:

http://www.postgresql.org/docs/current/static/sql-copy.html

Tùy thuộc vào định dạng chính xác của tập tin của bạn, nó có thể là một cái gì đó như:

COPY ratings FROM 'C:/Users/testUser/Desktop/TSV/ratings.list.tsv' DELIMITER '\t' 
+4

Thx cho câu trả lời của bạn. Tôi ngay lập tức đã thử nó, nhưng có: 'LRI: DELIMITER cho COPY phải là một ký tự một byte' – mrquad

+3

ok giải quyết nó tôi đã phải gõ một tab thay vì sử dụng' \ tab'. Thx để được giúp đỡ của bạn! – mrquad

+2

\ t - tab là mặc định, vì vậy trong trường hợp này, bạn không cần sử dụng DELIMITER –

2

Thật buồn khi phải nói, nhưng cách đơn giản nhất là để chuyển đổi các TSV đến một CSV. Hầu hết các tiện ích nhập Postgres được xây dựng để làm những việc như chuyển đổi chuỗi rỗng thành null, bỏ qua tiêu đề, v.v. chỉ là Chỉ dành cho CSV.

Xem đơn giản này 6 line Python answer on SO. Tôi sử dụng nó và sau đó CSV nạp như bình thường mà không có một vấn đề trong Postgres sau khi cố gắng và giờ để tải một TSV.

+0

Cảm ơn bạn đã bỏ phiếu tải xuống. Đối với các trường hợp sử dụng khác nhau, câu trả lời upvoted sẽ không hoạt động, do đó đề xuất ở trên.;) –

12

Bạn muốn một cái gì đó như thế này:

COPY ratings FROM 'C:/Users/testUser/Desktop/TSV/ratings.list.tsv' DELIMITER E'\t'; 

Các E'\t' là cần thiết, nếu không bạn sẽ nhận được một lỗi như thế này:

ERROR: DELIMITER for COPY must be a single one-byte character


Nếu các cột trong TSV don của bạn' t xếp hàng hoàn hảo với bảng của bạn, bạn cũng có thể xác định ánh xạ bằng cách làm như sau:

COPY ratings (column_1, column_2, ... column_n) 
    FROM 'C:/Users/testUser/Desktop/TSV/ratings.list.tsv' 
    DELIMITER E'\t'; 
+0

nếu bạn thêm CSV vào cuối, bạn cũng có thể sử dụng cờ HEADER – kdazzle

1

Tôi có thể thực hiện việc này với csvsql từ csvkit.

Để đọc một TSV (hoặc CSV) và tạo/chèn nó vào một bảng, kịch bản dòng lệnh của tôi trông như thế này:

csvsql --insert input.tsv --table table_t --tabs --no-constraints --db postgresql://user:[email protected]/mydb 
Các vấn đề liên quan