Java中文本文件数据提取的改进
我有CSV文件,其中包含以下表格中的示例数据:Java中文本文件数据提取的改进,java,arrays,file,csv,extraction,Java,Arrays,File,Csv,Extraction,我有CSV文件,其中包含以下表格中的示例数据: 220 30 255 0 0 Javascript 200 20 0 255 128 Thinking in java ,其中第一列是高度,第二列是厚度,接下来三列是颜色的rgb值,最后一列是标题。所有这些都需要作为单独的变量处理。我已经为此编写了自己的解决方案,但我想知道是否有更好/更简单/更短的方法。然后,提取的数据将用于创建Book对象,将每本书放入一组书中,并使用swing打印。 代码如下: pri
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
}
}
private static Book[]addBook(Book b,Book[]bookTab){
Book[]tmp=bookTab;
bookTab=新书[tmp.长度+1];
for(int i=0;i
您不应该使用子字符串,因为这会限制数据的格式/长度。如果您可以控制如何生成CSV(特别是分隔符),则可以使用StringTokenizer。您可能还希望使用数组来表示单行数据(定义一些常量以帮助澄清哪个元素表示什么)
我有CSV文件,其中包含此表单中的示例数据
那不是文件。这是一个“固定宽度格式化”文件
我想知道是否有更好/更容易/更短的方法来做这件事
使用realCSV文件格式。然后,使用大量可用的JavaCSVAPI,解析/格式化就很容易了。例如您甚至可以使用它在bean的列表
和CSV文件之间进行转换(就像您的案例中的书籍
)
(来自评论)该文件已经创建,我必须以该格式保存它。regex呢
正则表达式只会让事情变得更糟,因为它不是常规格式,而是固定格式!如果您不能更改格式,甚至不能更改为CSV,那么,您的方法就可以了。我只将
replaceAll(“,”)
替换为trim()
,因为这样效率更高(一个是regex,另一个只是解析)。将Book[]
替换为List
也是一个很好的建议,添加另一本书更容易。然后你可以只做书。添加(书)
。另请参阅。似乎是为此而设计的,如本文所建议。它有点过时,但是在使用.< /P>< P>时,它可以相当快。您应该考虑使用java 5中添加的那个。它是专门为处理这些类型的文件和字符串解析情况而创建的
下面是一个基于文件格式的简单示例(注意:为了清晰/简洁,我省略了所有相关的错误处理):
Scanner的优点是它有构造函数来接收字符串、文件或其他输入源,所以您可以将它用于任何东西。希望有帮助 那不是文件。这是一个“固定宽度格式化”文件。否则,解析CSV文件就很容易了。也许这只是你的例子,但你有没有理由不使用ArrayList或Vector作为书籍对象的数组?每次添加书籍时,您的
addBook
方法都会生成整个书籍数组的新副本。不是最有效的方式。不,文件已经创建,我必须以那种形式保存它。关于regex呢?好的,我知道在php中使用它们的语法,但是如何在java中应用它们呢?考虑到您需要使用固定宽度的输入格式,substring实际上可能是最好的工具。是的,您可以编写一个带有字段宽度量词的正则表达式,但这有点像在您已经有锤子的情况下使用瑞士军刀敲打钉子。子字符串不好,因为您限制了输入(您的高度始终小于x,高度始终小于y)。如果这些限制是好的,那么我认为子字符串是一个有效的选择。
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 + ")");
}
}
}