gpt4 book ai didi

java - 当记录布局直到运行时才知道时,使用什么方法来解析具有固定长度记录的文件?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:00:59 25 4
gpt4 key购买 nike

我想根据另一个文件中提供的记录布局来解析一个文件。

基本上会有一个定义文件,它是一个以逗号分隔的字段列表及其各自的长度。会有很多这样的,每次我运行程序时都会加载一个新的。

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 文件并创建某种动态解析器​​对象。看起来这个文件中的每一行都是一个不同的 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 文件的格式不正确。

希望这对您有所帮助。

关于java - 当记录布局直到运行时才知道时,使用什么方法来解析具有固定长度记录的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6868712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com