драйвер JDBC на основе файлов (не в памяти) для файлов CSV - PullRequest
1 голос
/ 27 сентября 2011

Существует ли драйвер JDBC на основе файлов с открытым исходным кодом (НЕ на основе памяти) для файлов CSV? Мой CSV динамически генерируется из пользовательского интерфейса в соответствии с выбором пользователя, и у каждого пользователя будет свой файл CSV. Я делаю это, чтобы уменьшить попадания в базу данных, так как информация содержится в файле CSV. Мне нужно только выполнить SELECT операций.

HSQLDB допускает индексированный поиск, если мы указываем индекс, но я не смогу предоставить уникальный столбец, который можно использовать в качестве индекса, поэтому он выполняет операции SQL в памяти.


Edit:

Я пробовал CSVJDBC, но он не поддерживает такие простые операции, как order by и group by. До сих пор неясно, читает ли он из файла или загружает в память.

Я пробовал xlSQL, но он опять-таки опирается на HSQLDB и работает только с Excel, а не с CSV. Плюс его больше нет в разработке или поддержке.

H2, но это только читает CSV. Не поддерживает SQL.

Ответы [ 5 ]

3 голосов
/ 27 сентября 2011

Вы можете решить эту проблему, используя базу данных H2 .

Следующий скрипт Groovy демонстрирует:

  1. Загрузка данных в базу данных
  2. Выполнение SQL-запросов «GROUP BY» и «ORDER BY»

Примечание: H2 поддерживает базы данных в памяти, поэтому у вас есть выбор - сохранять данные или нет.

// Create the database
def sql = Sql.newInstance("jdbc:h2:db/csv", "user", "pass", "org.h2.Driver")

// Load CSV file
sql.execute("CREATE TABLE data (id INT PRIMARY KEY, message VARCHAR(255), score INT) AS SELECT * FROM CSVREAD('data.csv')")

// Print results 
def result = sql.firstRow("SELECT message, score, count(*) FROM data GROUP BY message, score ORDER BY score")

assert result[0] == "hello world"
assert result[1] == 0
assert result[2] == 5

// Cleanup
sql.close()

Пример данных CSV:

0,hello world,0
1,hello world,1
2,hello world,0
3,hello world,1
4,hello world,0
5,hello world,1
6,hello world,0
7,hello world,1
8,hello world,0
9,hello world,1
10,hello world,0
1 голос
/ 27 сентября 2011

Это обсуждалось на Суперпользователе https://superuser.com/questions/7169/querying-a-csv-file.

Вы можете использовать функцию текстовых таблиц hsqldb: http://hsqldb.org/doc/2.0/guide/texttables-chapt.html

csvsql / gcsvsql также являются возможными решениями (но нет драйвера JDBC, вам придется запустить программу командной строки для вашего запроса).

sqlite - еще одно решение, но вам необходимо импортировать файл CSV в базу данных, прежде чем вы сможете запросить его.

В качестве альтернативы, есть коммерческое программное обеспечение, такое как http://www.csv -jdbc.com / , которое будет делать то, что вы хотите.

1 голос
/ 27 сентября 2011

Если вы проверяете проект sourceforge csvjdbc , пожалуйста, сообщите о своем опыте.в документации сказано, что это полезно для импорта файлов CSV.

Страница проекта

0 голосов
/ 26 марта 2012

Вы можете использовать либо специализированный драйвер JDBC, например CsvJdbc (http://csvjdbc.sourceforge.net)), либо вы можете настроить ядро ​​базы данных, такое как mySQL, для обработки вашего CSV как таблицы, а затем манипулировать своим CSV через стандартный драйвер JDBC.

Компромисс здесь - доступные функции SQL и производительность.

  • Прямой доступ к CSV через CsvJdbc (или аналогичный) позволит вам очень быстро выполнять операции с большими объемами данных, но без возможности сортировки илигруппировать записи с использованием команд SQL;
  • движок mySQL CSV может предоставить богатый набор функций SQL, но с затратами на производительность.

Так что, если размер вашей таблицы относительно мал -идти с MySQL. Однако, если вам нужно обрабатывать большие файлы (> 100 МБ) без необходимости группировки или сортировки - перейдите с CsvJdbc. Если вам нужно и то, и другое - обрабатывать очень BIF-файлы и иметь возможность манипулировать ими с помощью SQL, то оптимальный путь действий- сначала загрузить CSV в обычную таблицу базы данных (например, MySQL), а затем обрабатывать данные как обычную вкладку SQLле.

0 голосов
/ 27 сентября 2011

Чтобы сделать что-нибудь с файлом, вы должны в какой-то момент загрузить его в память.Что вы можете сделать, это просто открыть файл и читать его построчно, отбрасывая предыдущую строку, как вы читаете в новой.Единственным недостатком этого подхода является его линейность.Задумывались ли вы об использовании чего-то вроде memcache на сервере, где вы используете хранилища Key-Value в памяти, которые вы можете запрашивать вместо выгрузки в файл CSV?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...