如何读取带分隔符的文件

时间:2014-07-08 04:46:15

标签: java file

如果我有这样的文件,其中每个部分用“**”分隔。如何阅读每个部分并将它们放入不同的数据结构中?

AAA
BBB
CCC
**
ccc:cc
ddd:dd
**
xyz;XYZ
abc;ABC
**

Name: John
Email: john@gmail.com

Name: Jack
Email: jack@gmail.com

Name: kate
Email: kake@hotmail.com
**

在while循环中,我可以测试该行是否等于“**”。但由于每个部分的行数未知,似乎很难识别特定行属于哪个部分?

String line;
 while((line=reader.readline()) != null){

   if(!line.equals("**"){
      // the line has to be parsed and built into different data structures.
         For the first section, AAA,BBB,CCC will be added into an ArrayList.
   }
 }

5 个答案:

答案 0 :(得分:1)

IMO你应该让阅读方法更聪明一点。

这是一个示例(一种伪代码,假设您有一个能够执行实际IO的读取器):

void main() {
  List<List<String>> sections = ...
  while(reader.hasMoreDataToProcess()) {
     sections.add(processSection(reader));
  }
}


List<String> processSection(reader) {
  List<String> section = ...
  do {
     String line = reader.readLine();
     if(line.equals("**"))  { // end of section or whatever delimiter you have
         return section;
     }
     section.addLine(line);      
  }while(true);
}

答案 1 :(得分:0)

抱歉,匆忙,所以伪代码:

currentSection = []
sections = [currentSection]
for each line:
  if line is the separator:
    currentSection = []
    add currentSection to sections
  else:
    add line to currentSection

答案 2 :(得分:0)

您可以在Java中使用字符串类的split方法。

String string = "a-b,b-d,c-s,d-w,e-e,f-e";
String[] parts = string.split(",");
String part1 = parts[0]; // a-b
String part2 = parts[1]; // b-d

答案 3 :(得分:0)

您应该在此方案中使用扫描仪。这是你怎么做的。此代码未经过测试。

File file = new File("somefile.txt");

    try {

        Scanner sc = new Scanner(file);
        sc.useDelimeter("\\*\\*");
        while (sc.hasNext()) {
            String s = sc.next();
        }
        sc.close();
    } 
    catch (FileNotFoundException e) {
        e.printStackTrace();
    }

答案 4 :(得分:0)

您可以使用ScannerFileInputStream来扫描文件,使用setDelimiter(String)(接受正则表达式模式)来设置分隔符。

public class Test {
    public static void main(String[] args) {
            ArrayList<String> firstList = new ArrayList<>();
            ArrayList<String> secondList = new ArrayList<>();

        try(Scanner scanner = new Scanner(new FileInputStream(new File("yourFile.txt"))).useDelimiter("[*]+")) {
            firstList.add(scanner.next());
                    secondList.add(scanner.next());
                    // and so on

            scanner.close();
        } catch(FileNotFoundException e) {
            e.printStackTrace();
        } 
    }
}

这会占用**以上的所有内容,并从中创建一个字符串。如果需要,可以拆分String,并从每一行中获取数据。

String[] split = scanner.next().split("\n");
for(String string : split) {
     firstList.add(string);
}

在第一个示例中,正则表达式[*]+搜索多个*。了解有关正则表达式(正则表达式)的更多信息,以增加灵活性。