System.out.println () из базы данных в таблицу - PullRequest
1 голос
/ 29 марта 2011

В настоящее время я извлекаю свои данные из базы данных MS Access, и в java-приложении я отправляю system.out.print на консоль. Я использовал / t для разметки данных, однако это выглядит неловко. Я хотел бы поместить его в какой-то стол для более приятного взгляда. Любая помощь будет большой благодарностью.

          while(rs.next())
      {
          System.out.print(rs.getInt("season_number")+"\t");
          System.out.print(rs.getInt("season_episode_number")+"\t");
          System.out.print(rs.getInt("series_episode_number")+"\t");
          System.out.print(rs.getString("title")+"\t");
          System.out.print(rs.getString("directed_by")+"\t");
          System.out.print(rs.getString("written_by")+"\t");
          System.out.print(rs.getDate("origional_air_date")+"\t");
          System.out.println(rs.getFloat("viewing_figures")+"\t");

      }
   }

Ответы [ 4 ]

7 голосов
/ 29 марта 2011

Наилучшим решением для того, чтобы выровнять вывод, будет использование System.out.printf().

Поскольку printf очень похож на C 'printf, вы можете использовать управляющие символы для форматирования вывода.Как это:

System.out.printf( "%-3.2d %-20.20s\n", rs.getInt("season_number"), rs.getString("title") );

Проверьте эту ссылку out.

3 голосов
/ 29 марта 2011

Я поднял класс TablePrinter, который может быть полезен для вас

Фрагмент основного метода:

TablePrinter table = new TablePrinter("MyTest","OtherTest","SillyColumn");
table.addRow("ABC","DEF","GHIJKLMNOPQRSTUVWXYZ");
table.addRow("This is a test","of the","TablePrinter class");

table.print();

И результаты:

C:\junk>javac TablePrinter.java

C:\junk>java TablePrinter
TablePrinter test driver
| MyTest         | OtherTest | SillyColumn          |
-----------------------------------------------------
| ABC            | DEF       | GHIJKLMNOPQRSTUVWXYZ |
| This is a test | of the    | TablePrinter class   |


C:\junk>

Класс:

import java.util.ArrayList;
/**
 * The table printer classes takes a matrix of data and prints it.
 */
class TablePrinter {

    /**
     * The row class represents one row of data.
     * Yes, it's just a wrapper for String[], but it helps
     * keep it simple.
     */
    private static class Row {
        String[] data;
        Row(String[] v) { data = v; }
    }

    /**
     * Contains column header and max width information
     */
    private static class Col {
        String name;
        int maxWidth;
    }

    // matrix information
    Col[] cols;
    ArrayList<Row> rows;

    /**
     * Constructor - pass in columns as an array, or hard coded
     */
    public TablePrinter(String... names) {
        cols = new Col[names.length];
        for(int i = 0; i < cols.length; i++) {
            cols[i] = new Col();
            cols[i].name = names[i];
            cols[i].maxWidth = names[i].length();
        }

        rows = new ArrayList<Row>();
    }

    /**
     * Adds a row - pass in an array or hard coded
     */
    public void addRow(String... values) {
        if(values.length != cols.length) {
            throw new IllegalArgumentException("invalid number of columns in values");
        }

        Row row = new Row(values);
        rows.add(row);
        for(int i = 0; i < values.length; i++) {
            if(values[i].length() > cols[i].maxWidth) {
                cols[i].maxWidth = values[i].length();
            }
        }
    }

    /**
     * Helper method to make sure column headers and 
     * row information are printed the same
     */
    private void print(String v, int w) {
        System.out.print(" ");
        System.out.print(v);
        System.out.print(spaces(w - v.length()));
        System.out.print(" |");
    }

    /**
     * Ugly, poorly documented print method.
     * All pieces of production code should have some
     * methods that you have to decipher. This fulfils that requirement.
     */
    public void print() {

        System.out.print("|");
        for(Col col : cols) {
            print(col.name, col.maxWidth);
        }
        System.out.println("");
        int numDashes = cols.length*3 + 1;
        for(Col col : cols) numDashes += col.maxWidth;
        // TODO make columns have + instead of -
        System.out.println(dashes(numDashes)); 
        for(Row row : rows) {
            System.out.print("|");
            int i = 0;
            for(String v : row.data) {
                print(v,cols[i++].maxWidth);
            }
            System.out.println("");
        }
        System.out.println("");
    }

    // print a specific number of spaces for padding
    private static String spaces(int i) {
        StringBuilder sb = new StringBuilder();
        while(i  --> 0) sb.append(" ");
        return sb.toString();
    }

    // print a specific number of dashes
    private static String dashes(int i) {
        StringBuilder sb = new StringBuilder();
        while(i  --> 0) sb.append("-");
        return sb.toString();
    }

    // test driver
    public static void main(String[] args) {
        System.out.println("TablePrinter test driver");

        TablePrinter table = new TablePrinter("MyTest","OtherTest","SillyColumn");
        table.addRow("ABC","DEF","GHIJKLMNOPQRSTUVWXYZ");
        table.addRow("This is a test","of the","TablePrinter class");

        table.print();
    }

}
2 голосов
/ 04 ноября 2014

Я новичок в Java и как часть моих усилий по изучению этого, а также по использованию IDE, Javadoc, контроля версий, лицензирования, открытых источников и т. Д. Я написал простой служебный класс DBTablePrinter, который печатает строки из заданноготаблица или java.sql.ResultSet в стандартном формате, отформатированный, чтобы выглядеть как таблица со строками и столбцы с границами.Надеюсь, это кому-нибудь пригодится.

Вот ссылка на репозиторий на GitHub: https://github.com/htorun/dbtableprinter

А вот основное использование:

// Create a connection to the database
Connection conn = DriverManager.getConnection(url, username, password);

// Just pass the connection and the table name to printTable()
DBTablePrinter.printTable(conn, "employees");

Это должно напечатать что-то вроде этого:

Printing 10 rows from table(s) EMPLOYEES
+--------+------------+------------+-----------+--------+-------------+
| EMP_NO | BIRTH_DATE | FIRST_NAME | LAST_NAME | GENDER |  HIRE_DATE  |
+--------+------------+------------+-----------+--------+-------------+
|  10001 | 1953-09-02 | Georgi     | Facello   | M      |  1986-06-26 |
+--------+------------+------------+-----------+--------+-------------+
|  10002 | 1964-06-02 | Bezalel    | Simmel    | F      |  1985-11-21 |
+--------+------------+------------+-----------+--------+-------------+
    .
    .

Я благодарю всех, кто внес свой вклад в этот вопрос и в stackoverflow.com в целом.Ваши ответы мне очень помогли и продолжают помогать.

1 голос
/ 29 марта 2011

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

Если вы не уверены в этом, однако ... хорошоЕсли вы знаете максимальную длину каждого поля, вы можете просто дополнить каждый элемент пробелами до его максимальной длины.

Редактировать: Это может быть слишком большой помощью для домашней работы, но так как это второстепенная проблема,Вот пример:

private String pad(String value, int maxLength){
    String retVal = value;
    int remainder = maxLength - value.length();
    for (int i = 0; i < remainder; i++){
        retVal += " ";
    }
    return retVal;
}

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

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