使用java将从Postgres数据库收集的数据写入文本文件中

时间:2018-06-09 10:18:03

标签: java postgresql jdbc

我是Java的新手,正在寻找一种方法将从查询中收集的数据存储在磁盘上的文本文件中。确切地说,我正在做类似的事情 -

从blah_1,blah_2 where ....

中选择A,B,C

我正在使用JDBC驱动程序进行连接,而我正在存储List<>中收集的数据。使用RowMapper。

我想以这种方式存储在文本文件中的数据 -

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

package:" org.apache.poi.ss.usermodel"做这样的事情,但对于excel表,是否有类似的文本文件??

2 个答案:

答案 0 :(得分:1)

您可以使用String.formatString格式化提供许多选项,例如......

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 

您可以查看:

了解更多详情

如果您未提前知道列宽,则必须预先计算它们,类似于Properly aligning Strings on the console

中的示例

要编写文件,您应该从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();
}

答案 1 :(得分:0)

TL;博士

  

&#34; org.apache.poi.ss.usermodel&#34;做这样的事情,但对于excel表,是否有类似的文本文件??

是的,Apache Commons CSV库。

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

enter image description here

Apache Commons CSV

Answer by MadProgrammer效果很好。但是,如果您愿意,可以使用工具来帮助您以tab-delimitedcomma-separated-values (CSV)格式读取或写入文件数据。

我已将Apache Commons CSV用于此目的。这个库甚至精通ResultSet,因此它可以直接将数据传输到文件,而无需填充插入的数组或对象集合。实际上,Apache Commons CSV基本上在两行代码中完成了所有繁重工作。

第一行抓取列名并将其写入文本文件。

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

下一行循环结果集的所有行,将每行的每一列写入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();
}

使用H2 Database Engine创建内存数据库的完整示例应用程序,插入一些行,然后通过调用Apache Commons CSV库将所有数据转储为CSV格式的文本文件。

{{1}}

运行时的结果,新文件填充了数据。

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