Вывод данных запроса доступа к БД в файл csv с использованием Java

#java #csv #jackcess

#java #csv #jackcess

Вопрос:

Я могу открыть файл базы данных и получить имя запроса и инструкцию. Как мне вывести данные запроса в формат csv? Я думал, что приведенный ниже exportWriter сделает это, но это не работает.

 Database db = Database.open(new File(args[0]));    
    for(Query query : db.getQueries()) {
        System.out.println(query.getName()   ": "   query.toSQLString());
        if query.getName() = "thequerytooutput" {
            BufferedWriter csvOut = new BufferedWriter(new OutputStreamWriter(System.out));
    ExportUtil.exportWriter(db, query.getName(), csvOut, true, null, '"', 
        SimpleExportFilter.INSTANCE);
        }
    }
  

Комментарии:

1. Пожалуйста, опишите, как это не работает, например, сообщение об ошибке, или, если ошибки нет, то фактический вывод.

2. Это сообщение об ошибке, которое я получаю за исключением потока «main» java.lang. Исключение NullPointerException на com.healthmarketscience.jackcess. Идентификатор курсора.<инициализация> (Cursor.java:1490) на com.healthmarketscience.jackcess. Курсор $TableScanCursor. <инициализация>(Cursor.java:1334) на com.healthmarketscience.jackcess. Курсор $TableScanCursor. <инициализация>(Cursor.java:1322) на com.healthmarketscience.jackcess. Cursor.CreateCursor(Cursor.java:107) на com.healthmarketscience.jackcess. Экспортируйте файл.exportWriter(ExportUtil.java:271) в DumpQuery.main (неизвестный источник)

Ответ №1:

ExportUtil не выполняет запросы, он только выгружает таблицы. В качестве второго параметра необходимо указать допустимое имя таблицы. У Jackcess нет возможности выполнять sql-запросы, как отмечено здесь.

Ответ №2:

Я думаю, что лучшим вариантом было бы сначала сохранить ваши значения из базы данных в «двумерный» список строк (я предполагаю, что вы знаете, как это сделать [если нет, скажите мне, и я поясню подробнее]). А затем с помощью FileWriter запишите массив в файл CSV.

Этот пример был взят из stackabuse.com

 List<List<String>> rows = Arrays.asList(
    Arrays.asList("Jean", "author", "Java"),
    Arrays.asList("David", "editor", "Python"),
    Arrays.asList("Scott", "editor", "Node.js")
);

FileWriter csvWriter = new FileWriter("new.csv");
csvWriter.append("Name");
csvWriter.append(",");
csvWriter.append("Role");
csvWriter.append(",");
csvWriter.append("Topic");
csvWriter.append("n");

for (List<String> rowData : rows) {
    csvWriter.append(String.join(",", rowData));
    csvWriter.append("n");
}

csvWriter.flush();
csvWriter.close();
  

Комментарии:

1. Спасибо за ваше предложение. Я должен был включить импорт, который я использую, в скрипт импорта com.healthmarketscience.jackcess. запрос. Запрос; импортируйте com.healthmarketscience.jackcess. База данных; импортируйте com.healthmarketscience.jackcess. Экспортируйте файл; импортируйте com.healthmarketscience.jackcess. SimpleExportFilter; Я думаю, если я смогу получить строки запроса в <Список>, тогда я смогу сделать то, что вы предложили.

2. Отлично, попробуйте это. Если у вас не получится это сделать, я помогу вам позже. Прямо сейчас я ухожу из дома, поэтому не буду прикасаться к своему компьютеру в течение следующих 2-3 часов.

3. @zjb Привет, я вернулся домой. Не могли бы вы это сделать?

4. Нет. У меня нет. :(все еще пытаюсь

5. О, не волнуйтесь, я уверен, вы сможете это сделать. Сейчас я в постели и собираюсь лечь спать, но я помогу вам завтра, чтобы вы могли разобраться с этим. Тем временем, не могли бы вы уточнить запрос, который вы используете для доступа к базе данных, и сколько столбцов и строк содержит результирующий набор? 🙂