Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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_String_File_Split - Fatal编程技术网

Java 如何从具有动态条目的文件中拆分

Java 如何从具有动态条目的文件中拆分,java,arrays,string,file,split,Java,Arrays,String,File,Split,我正在尝试将从文件中逐行读取的大量字符串拆分 以下是文件中的部分内容: Jack, 50, Aldwynne, Field1, Field2, Field3, Field4, Field5 Goe, 23, Clearden, Field1, Field2, Field3, Field4, Field5 Mike, 33, Marblesilver, Field1, Field2 Lupis, 38, Aldfair, Field1, Field2, Field3 Frey, 21, Vertt

我正在尝试将从文件中逐行读取的大量字符串拆分
以下是文件中的部分内容:

Jack, 50, Aldwynne, Field1, Field2, Field3, Field4, Field5
Goe, 23, Clearden, Field1, Field2, Field3, Field4, Field5
Mike, 33, Marblesilver, Field1, Field2
Lupis, 38, Aldfair, Field1, Field2, Field3
Frey, 21, Verttown, Field1, Field2, Field3, Field4, Field5
Zulian, 45, Fogedge, Field1, Field2, Field3, Field4, Field5
我的代码:

BufferedReader br = new BufferedReader(new FileReader(FILENAME))
String currLine;
while ((currLine = br.readLine()) != null) {
    String []arr = currLine.trim().split("\\s*,[,\\s]*");

String first=arr[0];
String second=arr[1];
String third=arr[2];
String fourth=arr[3];
String fifth=arr[4];
String sixth=arr[5];
String seventh=arr[6];
String eighth=arr[7];

// Next Process
}
然后我将它们存储到变量中。前两行没有问题,但问题是第三行将生成错误
ArrayIndexOutOfBounds
,因为它没有第四个索引。因此,程序在第三行停止

那么,如何将空字符串(
“”
)设置为长度小于8的行中缺少的索引。我想要的是如下(例如:行ා3)


等等。如何做到这一点?

我建议使用另一个数组,不要按字段存储。在我下面的例子中:

public static void main(String args[]){
    String [] arr={"Jack", "50", "Aldwynne", "Field1", "Field2", "Field3", "Field4", "Field5"};
    String []resultArray = new String[1024]; // Any max lenght you want

    for(int i = 0; i< arr.length; i++)
        resultArray[i] = arr[i];
    for(int j = arr.length; j < resultArray.length; j++)
        resultArray[j] = "";
}
publicstaticvoidmain(字符串参数[]){
字符串[]arr={“Jack”、“50”、“Aldwynne”、“Field1”、“Field2”、“Field3”、“Field4”、“Field5”};
String[]resultArray=新字符串[1024];//任意所需的最大长度
对于(int i=0;i

使用resultArray,您将无法获得ArrayIndexOutOfBounds,只要数组的最大长度大于或等于所需的值数。

我想用空字符串来完成其他字段,如果您使用的是Java 8,您可以这样读取文件:

String fileName = "file.txt";
String regex = "\\s*,[,\\s]*";
int maxLength = 8;//This should be know from the beginning 
try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
    stream.map(line -> {
        List<String> list = new ArrayList<>(Arrays.asList(line.split(regex)));
        List<String> emptyFields = IntStream.range(0, maxLength - list.size())
                .mapToObj(s -> "")
                .collect(Collectors.toList());
        list.addAll(list.size(), emptyFields);
        return list;
    }).forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}

除此之外,我将创建一个MyObject类,该类保存此信息而不是数组,因此您的代码应该如下所示:

public class MyObject {

    private String first;
    private String second;
    private String third;
    private String fourth;
    private String fifth;
    private String sixth;
    private String seventh;
    private String eighth;

    //...Constructor, Getters, Setter
}

。。。
列表结果=stream.map(第->{
List List=newarraylist(Arrays.asList(line.split(regex));
List emptyFields=IntStream.range(0,maxLength-List.size())
.mapToObj(s->“”)
.collect(Collectors.toList());
list.addAll(list.size(),emptyFields);
退货清单;
}).map(line->new MyObject(line.get(0)),
第1行,第2行,第3行,第4行,
第四行,第五行,第六行)
).collect(Collectors.toList());
...

例如,您可以执行以下操作:

BufferedReader br = new BufferedReader(new FileReader(FILENAME));
String currLine;
while ((currLine = br.readLine()) != null) {
    String []readed = currLine.trim().split("\\s*,[,\\s]*");
    String []arr = new String [8];
    Arrays.fill(arr, "");
    System.arraycopy(readed, 0, arr, 0, readed.length);
    ...
    // Next Process
}
// do not forget to close it, in finally block or by using try-with-resources statement
br.close();

检查arr长度,如果小于预期值,则分配空字符串只需使用n作为计数器,并检查n>=arr.length。为这些字段设置空字符串。像字符串sixth=(n>=arr.length)?“”:arr[n++];非常感谢,它可以工作,实际上我已经尝试在开始时声明一个新数组,内容为空字符串,然后我意识到这个
split
函数可以减少数组的长度。我从未想过,我可以将
拆分的结果再次复制到新数组中。谢谢:)谢谢你的解决方案和建议,我尝试过了,效果很好,这让我很困惑:[,我是Java新手,所以我需要习惯它顺便说一句,你的解决方案比@m4gic的复杂度低吗?你可以在@HenryLietzberg测试它。我无法判断其他解决方案,你可以创建一个基准并检查哪一个更快:)
public class MyObject {

    private String first;
    private String second;
    private String third;
    private String fourth;
    private String fifth;
    private String sixth;
    private String seventh;
    private String eighth;

    //...Constructor, Getters, Setter
}
...
List<MyObject> result = stream.map(line -> {
    List<String> list = new ArrayList<>(Arrays.asList(line.split(regex)));
    List<String> emptyFields = IntStream.range(0, maxLength - list.size())
            .mapToObj(s -> "")
            .collect(Collectors.toList());
    list.addAll(list.size(), emptyFields);
    return list;
}).map(line -> new MyObject(line.get(0),
        line.get(1), line.get(2), line.get(3), line.get(4),
        line.get(4), line.get(5), line.get(6))
).collect(Collectors.toList());
...
BufferedReader br = new BufferedReader(new FileReader(FILENAME));
String currLine;
while ((currLine = br.readLine()) != null) {
    String []readed = currLine.trim().split("\\s*,[,\\s]*");
    String []arr = new String [8];
    Arrays.fill(arr, "");
    System.arraycopy(readed, 0, arr, 0, readed.length);
    ...
    // Next Process
}
// do not forget to close it, in finally block or by using try-with-resources statement
br.close();