java-当直到运行时才知道记录布局时,使用哪种方法来解析具有固定长度记录的文件?
作者:互联网
我想基于另一个文件中提供的记录布局来解析文件.
基本上会有一个定义文件,它是一个用逗号分隔的字段及其各自长度的列表.其中会有很多,每次我运行程序时都会加载一个新的.
firstName,text,20
middleInitial,text,1
lastName,text,20
salary,number,10
然后,我将显示一个带有提供的列标题的空白表,以及一个通过单击按钮或其他方式添加数据的选项-我尚未决定.
我还希望有一个选项,既可以从文件加载数据,也可以将数据保存到文件,文件匹配定义文件中描述的格式.
例如,要为上述定义文件加载的文件(或由保存功能生成的文件)可能看起来像这样.
Adam DSmith 50000
Brent GWilliams 45000
Harry TThompson 47500
什么样的模式在这里可能有用,谁能给我一些粗略的指导,以指导如何构建内部存储和建模数据的方式.
我想我可以找到有关Java文档的方法,但是,如果有人可以将我指向某个地方开始寻找,将不胜感激!
谢谢
解决方法:
因此,在我看来,您有一个howToParse文件和infoToParse文件,分别说明了如何解析信息以及在这些文件中解析信息的方向.
首先,我将阅读howToParse文件并创建某种动态Parser对象.看起来此文件中的每一行都是一个不同的ParsingStep对象.然后,您只需要读取将存储为String对象的行,并将ParsingStep分为3部分即可:字段名称,数据类型,数据长度.
// Create new parser to hold parsing steps.
Parser dynamicParser = new Parser();
// Create new scanner to read through parse file.
Scanner parseFileScanner = new Scanner(howToParseFileName);
// *** Add exception handling as necessary *** this is just an example
// Read till end of file.
while (parseFileScanner.hasNext()) {
String line = parseFileScanner.nextLine(); // Get next line in file.
String[] lineSplit = line.split(","); // Split on comma
String fieldName = lineSplit[0];
String dataType = lineSplit[1];
String dataLength = lineSplit[2]; // Convert to Integer with Integer.parseInt();
ParsingStep step = new ParsingStep(fieldName, dataType, dataLength);
dynamicParser.addStep(step);
}
parseFileScanner.close();
然后,您将具有如何解析一行的信息,然后只需解析另一个文件并将该文件中的信息存储在数组中即可.
// Open infoToParse file and start reading.
Scanner infoScanner = new Scanner(infoToParseFileName);
// Add exception handling.
while (infoScanner.hasNext()) {
String line = infoScanner.nextLine();
// Parse line and return a Person object or maybe just a Map of field names to values
Map<String,String> personMap = dynamicParser.parse(line);
}
infoScanner.close();
然后,唯一的其他代码就是确保解析器以正确的顺序进行解析.
public class Parser {
private ArrayList<ParsingStep> steps;
public Parser() {
steps = new ArrayList<ParsingStep>();
}
public void addStep(ParsingStep step) {
steps.add(step);
}
public Map<String,String> parse(String line) {
String remainingLine = line;
for (ParsingStep step : steps) {
remainingLine = step.parse(remainingLine);
}
return map; // Somehow convert to map.
}
}
就个人而言,我将在解析步骤中添加一些错误检查,以防infoToParse文件格式不正确.
希望这可以帮助.
标签:data-structures,file-io,java,parsing 来源: https://codeday.me/bug/20191208/2089049.html