我的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
}
}
答案 0 :(得分:1)
我的CSV文件包含此表单中的示例数据
那不是CSV文件。这是一个“固定宽度格式化”的文件。
我想知道是否没有更好/更容易/更短的方式来做这件事
使用真实 CSV文件格式。然后使用大量可用的Java CSV API轻松解析/格式化。例如OpenCSV。您甚至可以使用它在List
个bean(例如您的Book
)和CSV文件之间进行转换。
(来自评论)该文件已经创建,我必须将其保存在该表单中。正则表达式怎么样?
正则表达式只会让事情变得更糟,因为它不是采用常规格式,而是采用固定格式!如果你不能改变格式,甚至不能改变CSV格式,那么,你的方法就好了。我只会将replaceAll(" ", "")
替换为trim()
,因为那是效率(一个是正则表达式,另一个是解析)。将Book[]
替换为List<Book>
也是一个很好的建议,添加另一本书会更容易。然后,您可以books.add(book)
。另请参阅Collections tutorial。
答案 1 :(得分:0)
您不应该使用子字符串,因为这会限制数据的格式/长度。如果您可以控制CSV的生成方式(特别是分隔符),则可以使用StringTokenizer。您可能还想使用数组来表示单行的数据(定义一些常量以帮助阐明哪个元素代表什么)。
答案 2 :(得分:0)
StreamTokenizer
似乎是为此做出的,正如example中所述。它有点过时了,但与BufferedReader
一起使用时可以相当快。
答案 3 :(得分:0)
您应该考虑使用Java 5中添加的java.util.Scanner class。它专门用于处理这些类型的文件和字符串解析情况。
以下是基于您的文件格式的简短示例(注意:为了清晰/简洁,我省略了所有相关的错误处理):
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,所以你几乎可以使用它。希望有所帮助!