簡體   English   中英

改進Java中文本文件的數據提取

[英]improving data extraction from text file in Java

我有以這種形式提供樣本數據的CSV文件:

220 30    255   0   0     Javascript
200 20      0 255 128     Thinking in java

,其中第一列是高度,第二列是厚度,接下來的三個是顏色的rgb值,最后一個是標題。 所有這些都需要被視為單獨的變量。 我已經為此編寫了自己的解決方案,但我想知道是否沒有更好/更容易/更短的方法來做到這一點。 然后,提取的數據將用於創建Book對象,將每本Book放入一系列書籍並使用swing進行打印。 這是代碼:

private static Book[] addBook(Book b, Book[] bookTab){
        Book[] tmp = bookTab;
        bookTab = new Book[tmp.length+1];
        for(int i = 0; i < tmp.length; i++){
                bookTab[i] = tmp[i];
        }
        bookTab[tmp.length] = b;

        return bookTab;
}

public static void main(String[] args) {

    Book[] books = new Book[0];

    try {
        BufferedReader file = new BufferedReader(new FileReader("K:\\books.txt"));

        String s;
        while ((s = file.readLine()) != null) {
            int hei, thick, R, G, B;
            String tit;

            hei = Integer.parseInt(s.substring(0, 3).replaceAll(" ", ""));
            thick = Integer.parseInt(s.substring(4, 6).replaceAll(" ", ""));
            R = Integer.parseInt(s.substring(10, 13).replaceAll(" ", ""));
            G = Integer.parseInt(s.substring(14, 17).replaceAll(" ", ""));
            B = Integer.parseInt(s.substring(18, 21).replaceAll(" ", ""));

            tit = s.substring(26);

            System.out.println(tyt+wys+grb+R+G+B);

            books = addBook(new Book(wys, grb, R, G, B, tyt),books);
        }
        file.close();
    } catch (IOException e) {
        //do nothing
    }
}

我有CSV文件,其中包含此表單中的示例數據

這不是CSV文件。 這是一個“固定寬度格式化”的文件。

我想知道是否沒有更好/更容易/更短的方法來做到這一點

使用真實的 CSV文件格式。 然后使用大量可用的Java CSV API輕松解析/格式化。 例如OpenCSV 您甚至可以使用它在Bean List (如您的案例中為Book )和CSV文件之間進行轉換。

(來自評論)文件已經創建,我必須保持該格式。 正則表達式怎么樣?

正則表達式只會讓事情變得更糟,因為它不是常規格式,而是固定格式! 如果你不能改變格式,甚至不能改變CSV格式,那么,你的方法就好了。 我只會用trim()替換replaceAll(" ", "") ,因為那是效率(一個是正則表達式,另一個是解析)。 List<Book>替換Book[]也是一個很好的建議,添加另一本書更容易。 然后你可以做books.add(book) 另請參閱集合教程

您不應該使用子字符串,因為這會限制數據的格式/長度。 如果您可以控制CSV的生成方式(特別是分隔符),則可以使用StringTokenizer。 您可能還希望使用數組來表示單行的數據(定義一些常量以幫助闡明哪個元素代表什么)。

就像這個例子中所建議的那樣, StreamTokenizer似乎是為此而做的。 它有點過時了,但與BufferedReader使用時速度相當快。

您應該考慮使用Java 5中添加的java.util.Scanner類 。它專門用於處理這些類型的File和String解析情況。

這是一個基於您的文件格式的簡短示例(注意:為了清晰/簡潔,我省略了所有相關的錯誤處理):

import java.util.Scanner;
import java.io.File;
import java.lang.String;

class Dummy
{
    public static void main(String[] args) throws Exception
    {
       Scanner sc = new Scanner(new File("file.txt"));
       while(sc.hasNext())
       {
               int hei = sc.nextInt();
               int thick = sc.nextInt();
               int r = sc.nextInt();
               int g = sc.nextInt();
               int b = sc.nextInt();
               String title = sc.nextLine().trim();

               System.out.println("Book(" + hei + "," + thick + "," + 
               r + "," + g + "," + b + "," + title + ")");
       }
    }
}

關於Scanner的好處是它有構造函數來接受字符串,文件或其他InputSources,所以你幾乎可以使用它。 希望有所幫助!

暫無
暫無

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

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