Запись данных, собранных из базы данных Postgres, в текстовый файл с использованием Java - PullRequest
0 голосов
/ 09 июня 2018

Я новичок в Java и ищу способ хранения данных, собранных по запросу, в текстовом файле на моем диске.Если быть точным, я делаю что-то вроде -

Выберите A, B, C из blah_1, blah_2 где ....

Я использую драйвер JDBC для подключения и храню данныесобраны в List <> с помощью RowMapper.

Я хочу, чтобы данные сохранялись в текстовом файле следующим образом -

    A        B        C
    a1       b1       c1
    a2       b2       c2
    .        .        .
    .        .        .

package: "org.apache.poi.ss.usermodel" делаетчто-то вроде этого, но для листов Excel, есть ли что-то подобное для текстовых файлов ??

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

tl; dr

"org.apache.poi.ss.usermodel" делает что-то подобное, но для листов Excel, есть ли что-то похожее для текстовых файлов ??

Да, библиотека Apache Commons CSV .

CSVPrinter printer = CSVFormat.RFC4180.withHeader( rs ).print( writer ); // Write header row, using database column header names.
printer.printRecords( rs ); // Write each row of the entire result set.

enter image description here

Apache Commons CSV

Ответ MadProgrammer работает достаточно хорошо.Но если хотите, есть инструменты, которые помогут вам читать или записывать данные в файлы в формате с разделителями-запятыми или с разделителями-запятыми (CSV) .

Для этой цели я использовал Apache Commons CSV .Эта библиотека даже подкована с ResultSet, поэтому она может напрямую передавать ваши данные в файл, не заполняя промежуточный набор массивов или коллекцию объектов.Действительно, Apache Commons CSV выполняет всю тяжелую работу в основном из двух строк кода.

Первая строка захватывает имена столбцов и записывает их в текстовый файл.

CSVPrinter printer = CSVFormat.RFC4180.withHeader( rs ).print( writer ); // Write header row, using database column header names.

Следующая строка зацикливает все строки набора результатов, записывая каждый столбец каждой строки в текстовый файл в формате CSV.

printer.printRecords( rs ); // Write each row of the entire result set.

Полный пример приложения, которое создаетбаза данных в памяти, используя H2 Database Engine , вставляет несколько строк, а затем выгружает все данные в текстовый файл в формате CSV, вызывая библиотеку Apache Commons CSV.

try (
    Connection conn = DriverManager.getConnection( "jdbc:h2:mem:trashme" )
) {
    String sql = "CREATE TABLE " + "abc_" + " (\n" +
                     "  data UUID default random_uuid() , \n" +  // Every table should have a primary key.
                     "  a_ VARCHAR , \n" +                       // Three columns per the Question.
                     "  b_ VARCHAR , \n" +
                     "  c_ VARCHAR \n" +
                     " );";
    try (
        Statement stmt = conn.createStatement() ;
    ) {
        stmt.execute( sql );
    }

    sql = "INSERT INTO abc_ (a_ , b_ , c_ ) VALUES ( ? , ? , ? ) ;";
    try ( PreparedStatement ps = conn.prepareStatement( sql ) ) {
        for ( int i = 1 ; i <= 10 ; i++ ) {
            ps.setString( 1 , "a" + i );
            ps.setString( 2 , "b" + i );
            ps.setString( 3 , "c" + i );
            ps.executeUpdate();
        }
    }

    sql = "SELECT a_ , b_ , c_ FROM abc_ ; ";
    try (
        Statement stmt = conn.createStatement() ;
    ) {
        ResultSet rs = stmt.executeQuery( sql );
        // File
        Path path = FileSystems.getDefault().getPath( System.getProperty( "user.home" ) , "trashme.txt" );
        try (
            BufferedWriter writer = Files.newBufferedWriter( path , Charset.forName( "UTF-8" ) ) ;
        ) {
            final CSVPrinter printer = CSVFormat.DEFAULT.withHeader( rs ).print( writer ); // Write header row, using database column header names.
            printer.printRecords( rs ); // Write each row of the entire result set.
        } catch ( IOException x ) {
            System.err.format( "IOException: %s%n" , x );
        }
    }

} catch ( SQLException eArg ) {
    eArg.printStackTrace();
}

Результат при запуске нового файла, заполненного данными.

Screenshot of the Finder app on macOS, file “trashme.txt” selected, exposing contents of three columns “A”, “B”, and “C”.

0 голосов
/ 09 июня 2018

Вы можете использовать String.format, который предоставляет ряд опций для форматирования String, например ...

System.out.println(String.format("%-10s%-10s%-10s", "A", "B", "C"));
for (int index = 0; index < 10; index++) {
    System.out.println(String.format("%-10s%-10s%-10s", "a" + index, "b" + index, "c" + index));
}

Распечатает ...

A         B         C         
a0        b0        c0        
a1        b1        c1        
a2        b2        c2        
a3        b3        c3        
a4        b4        c4        
a5        b5        c5        
a6        b6        c6        
a7        b7        c7        
a8        b8        c8        
a9        b9        c9 

Вы можете посмотреть:

для получения более подробной информации

Если вы не знаете ширину столбцов заранее, вам придется предварительно рассчитать их, что-то похожее на пример в Правильное выравнивание строк на консоли

Для записи файлаВы должны начать с Basic I / O , но это может выглядеть примерно так ...

try (BufferedWriter bw = new BufferedWriter(new FileWriter(new File("some file somewhere.txt")))) {
    bw.write(String.format("%-10s%-10s%-10s", "A", "B", "C"));
    bw.newLine();
    for (int index = 0; index < 10; index++) {
        bw.write(String.format("%-10s%-10s%-10s", "a" + index, "b" + index, "c" + index));
        bw.newLine();
    }
} catch (IOException ex) {
    ex.printStackTrace();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...