2009-09-23 34 views
12

Tôi cần áp dụng truy vấn SQL vào tệp CSV (tệp văn bản được phân cách bằng dấu phẩy). SQL của tôi được xác định trước từ một công cụ khác và không đủ điều kiện để thay đổi. Nó có thể chứa các lựa chọn nhúng và bí danh bảng trong phần FROM.Thực thi SQL trên tệp CSV qua JDBC

Đối với nhiệm vụ của tôi, tôi đã tìm thấy hai mã nguồn mở (đây là một yêu cầu dự án) thư viện cung cấp trình điều khiển JDBC:

  1. CsvJdbc
  2. XlSQL
  3. JBoss Teiid
  4. Tạo một Apache Derby DB, tải tất cả CSV dưới dạng bảng và thực hiện truy vấn.

Đây là những vấn đề tôi gặp phải:

  1. nó không chấp nhận các cú pháp của SQL (nó sử dụng Lựa chọn nội và bí danh bảng). Hơn nữa, nó đã không được duy trì kể từ năm 2004.
  2. Tôi không thể làm cho nó hoạt động, vì nó phụ thuộc vào một trình phân tích cú pháp SAX gây ra ngoại lệ khi phân tích các tài liệu khác. Tương tự, không có thay đổi nào kể từ năm 2004.
  3. Chưa kiểm tra xem nó có hỗ trợ cú pháp hay không, nhưng có vẻ như là chi phí. Nó cần một số thực thể xác định (Cơ sở dữ liệu ảo, Bindings). Từ danh sách gửi thư, họ nói với tôi rằng bản phát hành cuối cùng hỗ trợ việc tạo các đối tượng cần thiết. Có ai sử dụng nó cho nhiệm vụ đơn giản như vậy (bình thường nó có thể kết nối với một số loại dữ liệu, như CSV, XML hoặc DBS khác và tạo một, một hợp nhất ảo)?
  4. Điều này có thể thực hiện dễ dàng không?

Từ 4 điều tôi đã xem xét/thử, chỉ có 3 và 4 dường như khả thi. Bất kỳ lời khuyên nào về những cách này hoặc bất kỳ cách nào khác mà tôi có thể truy vấn tệp CSV của mình?

Cheers

Trả lời

3

Nếu SQL của bạn là xác định trước và không thể thay đổi lựa chọn tốt nhất của bạn là để tải CSV của bạn thành một cơ sở dữ liệu và chạy các truy vấn chống lại nó.

Apache Derby là một lựa chọn khả thi, vì vậy là MySQL, thậm chí có CSV storage engine hoặc PostgreSQL.

SQL của bạn có sử dụng bất kỳ chức năng/tiện ích mở rộng độc quyền nào không? Nếu có, điều đó có thể hạn chế lựa chọn của bạn.

+0

Có, nó sử dụng chuỗi con và nối. –

3

Tôi muốn nói db được nhúng. Tôi muốn đề nghị hoặc Javadb (Derby được xây dựng trong Java API) hoặc H2 nếu bạn không quan tâm đến việc kéo phụ thuộc thêm.

9

Tôi sẽ tải dữ liệu vào HSQL (HypersonicSQL). Java thuần túy, đúng SQL, được chứng minh tốt. Khá nhiều thứ khác có dấu chân lớn hơn.

+1

Trong thực tế HSQLDB là giải pháp được đề xuất duy nhất có thể mở tệp CSV hiện có dưới dạng bảng SQL. Nó cho phép thực hiện cả hai truy vấn SQL trực tiếp trên tệp CSV và cập nhật các bản ghi. – fredt

+1

http://hsqldb.org/doc/guide/ch06.html chứa thêm chi tiết –

+0

Hi @Vladimir nếu tập tin csv tôi muốn xử lý là rất lớn về 5 đến 10 GB ?? – u449355

0

Có một tập lệnh Groovy, gcsvsql cho phép bạn xem các tệp csv dưới dạng các bảng cơ sở dữ liệu, bao gồm các kết nối. Với gcsvsql bạn có thể làm những việc như:

gcsvsql "select * from people.csv nơi tuổi> 40"

gcsvsql "chọn people.name, trẻ em.trẻ em từ people.csv, children.csv nơi people.name = children.name"

gcsvsql "chọn trung bình (điểm số) từ people.csv nơi tuổi < 40"

Bạn có thể tìm thấy kịch bản này, mà là dựa trên cơ sở dữ liệu h2, tại Google mã ở đây:

http://code.google.com/p/gcsvsql/

1

Nếu bạn đang muốn đối xử với file csv như cơ sở dữ liệu từ bên trong một chương trình Java, bạn nên nhìn vào h2 database engine. Nó có hỗ trợ thực sự tốt đẹp cho việc đọc/ghi các tập tin CSV và làm việc với cơ sở dữ liệu trong bộ nhớ. Nó là một kế thừa cho hsql, nhanh hơn và với các tính năng bổ sung. Bạn có thể đọc về hỗ trợ csv trong hướng dẫn h2.

+0

Bạn có thể đọc cách thực hiện dễ dàng này bằng cách sử dụng h2 trong tập lệnh Groovy trong bài đăng trên blog này: http://bayesianconspiracy.blogspot.com/2010 /02/executing-arbitrary-sql-on-csv-files.html – Kolmogorov

1

có thể hơi muộn, xin lỗi vì điều đó.

Tôi đã phát triển csvjdbc trong hơn một năm nay và kể từ một vài tuần tôi đã có quyền "quản trị" trên dự án đó nên tôi có thể phát hành phiên bản mới nhất mà tôi đã tạo. nó làm tất cả "chúng ta" cần (chúng tôi: tôi và các đồng nghiệp hiện tại của tôi) cần, và tôi đang thêm những thứ như là lỗi được đệ trình.

hãy xem xét ngay bây giờ và quyết định lại. (tài liệu web vẫn cần xem xét, để có cái nhìn sâu sắc hơn, hãy kiểm tra các trường hợp thử nghiệm, rất rộng rãi).

+0

lựa chọn nhúng? bí danh bảng? không, chưa có sẵn ở đó. nhưng sau đó một lần nữa, cảm thấy tự do để gửi một báo cáo lỗi với một truy vấn không làm việc và những người hiểu biết ... – mariotomo

0

tôi biết, đó là một trường hợp rất cũ, nhưng ...

CsvJdbc là một thư viện mát mẻ, nhưng có một số vấn đề sử dụng DbUtils khi ResultsSets bản đồ để POJO. Một điều xấu thứ hai là, rằng không có sự hỗ trợ tốt cho các kiểu dữ liệu khác nhau.

Sau khi chơi với CSVJdbc, tôi sẽ sử dụng một CsvParser ngu ngốc để đọc các tập tin bơm chúng vào một HsqlDB hoặc một cái gì đó như thế.

+0

bạn đã báo cáo các vấn đề với csvjdbc? người duy trì hiện tại (không phải tôi nữa) là rất nhanh chóng trong việc chọn lên các vấn đề nghiêm trọng. – mariotomo

+0

Không, tôi không có. Tôi không thể tạo một vé ở đó. – Mirko

+0

bạn sẽ có thể tạo một vé tại đó khi bạn đăng nhập/đăng ký. người dùng ẩn danh không được phép tạo và cập nhật vé. Tôi đoán để tránh những kẻ gửi thư rác ... nhưng cụ thể hơn, những gì "một số vấn đề" bạn gặp, và những gì "hỗ trợ tốt" bạn mong đợi? – mariotomo

Các vấn đề liên quan