3

我有 CSV 文件,其中包含以下形式的示例数据:

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

,其中第一列是高度,第二列是厚度,接下来的三列是颜色的 rgb 值,最后一列是标题。所有这些都需要被视为单独的变量。我已经为此编写了自己的解决方案,但我想知道是否没有更好/更简单/更短的方法来做到这一点。然后提取的数据将用于创建 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
    }
}
4

4 回答 4

1

我有 CSV 文件,其中包含此表单中的示例数据

那不是CSV文件。那是一个“固定宽度格式”的文件。

我想知道是否没有更好/更容易/更短的方法来做到这一点

使用真正的CSV 文件格式。然后使用大量可用的 Java CSV API 进行解析/格式化会很容易。例如OpenCSV。您甚至可以使用它在一个Listbean(如Book您的情况)和一个 CSV 文件之间进行转换。

(来自评论)文件已经创建,我必须以这种形式保存它。正则表达式呢?

正则表达式只会让事情变得更糟,因为它不是常规格式,而是固定格式!如果您不能更改格式,即使不能更改为 CSV,那么,您的方法就可以了。我只会替换replaceAll(" ", "")为,trim()因为这样更有效(一个是正则表达式,另一个只是解析)。替换Book[]List<Book>也是一个好建议,添加另一本书更容易。然后你可以做books.add(book)。另请参阅集合教程

于 2010-05-07T01:01:23.267 回答
0

您不应该使用子字符串,因为这会限制数据的格式/长度。如果您可以控制 CSV 的生成方式(特别是分隔符),则可以使用 StringTokenizer。您可能还想使用一个数组来表示一行的数据(定义一些常量以帮助阐明哪个元素代表什么)。

于 2010-05-07T00:45:46.747 回答
0

StreamTokenizer似乎为此而生,如本示例中所建议的那样。它有点过时了,但与BufferedReader.

于 2010-05-07T01:34:49.250 回答
0

您应该考虑使用 Java 5 中添加的java.util.Scanner 类。它是专门为处理这类文件和字符串解析情况而创建的。

这是一个基于您的文件格式的简短示例(注意:为了清晰/简洁,我省略了所有相关的错误处理):

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 的好处在于它具有接收字符串、文件或其他输入源的构造函数,因此您几乎可以将它用于任何东西。希望有帮助!

于 2010-05-07T02:34:13.477 回答