簡體   English   中英

使用Java將從Postgres數據庫收集的數據寫入文本文件

[英]Writing data collected from Postgres database in a text file using java

我是Java新手,正在尋找一種方法來存儲從查詢中收集的數據到磁盤上的文本文件中。 確切地說,我正在做類似的事情-

從blah_1,blah_2其中...選擇A,B,C。

我正在使用JDBC驅動程序進行連接,並且正在使用RowMapper存儲在List <>中收集的數據。

我希望數據以這種方式存儲在文本文件中-

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

包:“ org.apache.poi.ss.usermodel”執行類似的操作,但對於excel工作表,文本文件是否有類似內容?

您可以使用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 

您可以看一下:

更多細節

如果您不提前知道列寬,則必須預先計算它們,類似於在控制台上正確對齊字符串中的示例

為了編寫文件,您應該從基本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();
}

TL;博士

“ 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.

在此處輸入圖片說明

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數據庫引擎創建內存數據庫,插入一些行,然后通過調用Apache Commons CSV庫將所有數據轉儲為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();
}

運行時的結果是,新文件中填充了數據。

macOS上Finder應用程序的屏幕快照,已選擇文件“ trashme.txt”,其中顯示了三列“ A”,“ B”和“ C”的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM