java解析定长文件入库_java-当直到运行时才知道记录布局时,使用哪种方法来解析具有固定长度记录的文件?...-程序员宅基地

技术标签: 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 personMap = dynamicParser.parse(line);

}

infoScanner.close();

然后,唯一的其他代码就是确保解析器以正确的顺序进行解析.

public class Parser {

private ArrayList steps;

public Parser() {

steps = new ArrayList();

}

public void addStep(ParsingStep step) {

steps.add(step);

}

public Map 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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_35381077/article/details/114758348

智能推荐

Notepad++设置文件默认语言和关键字高亮显示_notepad语言abaqus关键词-程序员宅基地

文章浏览阅读9.4k次,点赞4次,收藏8次。1、【设置】–>【语言格式设置】2、左侧【语言】框中选择文本语言(此处以SQL为例)3、在【自定义扩展名】中添加文件格式(多个格式之间用空格分隔)此处添加的两种文件格式为hql和txt,保存之后,下次使用Notepad++打开.sql .hql .txt文件时将默认使用SQL语言,同理可按需求设置其他文件格式4、自定义高亮显示关键字(多个关键字用空格分隔)在Notep..._notepad语言abaqus关键词

微信小程序_js 延时 微信小程序-程序员宅基地

文章浏览阅读264次。微信小程序 一般组件的方法只能通过点击事件触发 如果想要它自己调取可以通过下面的方法ready(){//自带的方法 ready 返回一个结果 this.getbanner() }..._js 延时 微信小程序

Lunix设置RSA秘钥登录_ssh 指定 id_rsa-程序员宅基地

文章浏览阅读1.3k次。Lunix设置RSA秘钥登录_ssh 指定 id_rsa

FreeNas OS Windows SMB 所有用户登录后共享同一文件夹_freenas 多用户 多文件夹-程序员宅基地

文章浏览阅读1.4k次。@ [TOC]** FREENAS WINDOWS SMB 登录后公共使用文件夹的共享设置。。**FreeNas OS Windows SMB 所有用户登录后共享同一文件夹。。有时候即使是公用文件夹,也不想给没有认证的使用者看到。上期讲了,不登录系统才能使用的共享文件夹,今天讲一下,要登录系统后才能看到及使用的公共文件夹内的文件。设置起来比较复杂。..._freenas 多用户 多文件夹

面试题目--预处理与宏_用宏名代替字符串时,只做简单的代换,不进行任何计算,也不进行正确性检查-程序员宅基地

文章浏览阅读155次。1、预处理--条件编译#ifdef 宏名 程序段1#else 程序段2#endif#include <iostream>using namespace std;#define DEBUGint main(){#ifdef DEBUG printf("We have defined DEBUG!");#else p..._用宏名代替字符串时,只做简单的代换,不进行任何计算,也不进行正确性检查

html5-地理位置定位 API 接口开发 -程序员宅基地

文章浏览阅读232次。转载自【http://www.656463.com/article/336】HTML5地理位置定位API接口开发包括:地理位置定位原理与介绍和HTML5中地理位置定位的方法,最后获取经纬度显示当前位置在百度地图上地理位置定位原理与介绍地理位置定位的几种方式:IP地址,GPS,Wifi,GSM/CDMA地理位置获取流程:1、用户打开需要获取地理位置的web应用。..._html5的地理位置接口

随便推点

无法解析的外部符号 _cublascreate_v2@4,等一系列的类似问题(用于x64位。)以及vs2013+cuda8.0+win10配置过程_cuda程序报错无法解析的外部符号cublascreate_v2,该函数在main函数中被引用-程序员宅基地

文章浏览阅读9.4k次,点赞13次,收藏35次。首先贴出我的问题,解决的就是这个问题。要解决这个问题,首先要看你的cuda环境配置的是否正确,那么就要从头跟着我们走一遍,再检查一下您配置的是否正确。1>1.cu.obj : error LNK2019: 无法解析的外部符号 cublasDestroy_v2,该符号在函数 main 中被引用1>1.cu.obj : error LNK2019: 无法解析的外部符号 cudaFree,该..._cuda程序报错无法解析的外部符号cublascreate_v2,该函数在main函数中被引用

appium+python开发09--框架封装,作用yaml作数据驱动_from appium.webdriver.webdriver import webdriver用法-程序员宅基地

文章浏览阅读1.3k次。雪球APP:实现股票查询:(Search)股票选择:(Selected)登陆操作的封装:Profilepage页面登陆页面目录结构:AndroidClient.py主要实现app的安装的启动功能:from appium import webdriverfrom appium.webdriver.webdriver i..._from appium.webdriver.webdriver import webdriver用法

spring集成kafka运行时报错:Failed to construct kafka producer] with root cause-程序员宅基地

文章浏览阅读5.2k次。spring集成kafka运行时报错:Failed to construct kafka producer] with root causeorg.apache.kafka.common.KafkaException: class org.apache.kafka.common.serialization.StringDeserializer is not an instance of org.apache.kafka.common.serialization.Serializer如图:_failed to construct kafka producer

C++多线程启动、暂停、继续与停止_c++线程启动与挂起-程序员宅基地

文章浏览阅读8.7k次,点赞11次,收藏65次。在自动化设备中,设备在运转过程中,为了防止设备伤人,通常会在设备门入口安装光幕,当光幕被遮挡时,设备必须暂停,确保安全的情况下,按下继续按钮,设备继续运转。对于多工位的设备,每个工位可能交由一个线程处理,因此暂停时,需要令这些线程暂时挂起。C++11标准以后,加入了线程相关的接口,在应用中经常需要使线程暂停,在windows API中可以使用suspend 使线程挂起,但容易产生一些意想不到的问题,官方并不推荐使用。但 C++11 中没有使线程暂停的接口。现用条件变量与互斥锁封装一个线程类,实现线程的暂._c++线程启动与挂起

win10 计算器提示:需要新应用打开此calculator_ms-calculator-程序员宅基地

文章浏览阅读3.8w次,点赞9次,收藏9次。升级win10后,在“开始“下方搜索不到计算器,运行calc,会出现需要新应用打开此Calculator,打开应用商店,找到计算器,仍然可以被使用,我怀疑是我自己在清理PC的注册表的时候将系统的一些设置修改了,导致c:\Windows\System32\calc这个程序与应用商店里面的计算器之间的对应关系没有了,这样每次运行calc的时候就会出现这种问题。下面是我的解决办法:以管理员身份运行Win..._ms-calculator

IDEA / WebStorm / PhpStorm 添加jQuery自动提示,自动补全,提示文档_webstorm 前端框架提示-程序员宅基地

文章浏览阅读2.3k次。WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。使用webstorm可对jQuery、ext等JavaScript框架进行代码提示,功能十分_webstorm 前端框架提示

推荐文章

热门文章

相关标签