ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-12-08 05:04:01  阅读:257  来源: 互联网

标签:data-structures file-io java parsing


我想基于另一个文件中提供的记录布局来解析文件.

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

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有