Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中文本文件数据提取的改进_Java_Arrays_File_Csv_Extraction - Fatal编程技术网

Java中文本文件数据提取的改进

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

我有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
    }
}
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 + ")");
       }
    }
}