`

解析Txt文件的过程

    博客分类:
  • Java
阅读更多
解析Txt文件的过程

项目需要解析用逗号(,)分隔的文本文件,然后将其中的数据转换成xml文件进行导入到财务系统中....
考虑到以后可能文件格式会变化,因此使用了动态的创建方法,即通过格式文件来动态解析txt文件..本程序使用了apache的Digester来动态生成格式文件,使用CGLib动态生成目标类.步骤如下:
1、定义文件和字段的元数据格式,如果出现其他的文件格式只需要实现元数据接口即可..接口代码:
java 代码
  1. public interface FileMeta {
  2. public String getName();
  3. public List<fieldmeta></fieldmeta> getFieldMeta();
  4. }
  5. public interface FieldMeta {
  6. public String getName();
  7. public String getType();
  8. public int getLength();
  9. public int getScale();
  10. public String getComment();
  11. public boolean isAllowNull();
  12. }
通过两个接口描述文件的属性已经字段格式..

本例使用的是逗号分隔,如果出现其他分隔符怎么办?为此,定义了一个分隔符接口:LineSpliter
java 代码
  1. public interface LineSpliter {
  2. public String getSpliterRegx();
  3. public String[] split(String lineData);
  4. }
getSpliterRegx()同于返回当前的分隔符,split()用户处理各行文本数据.
此处缺省实现了此接口,用于逗号分隔DefaultLineSpliter,定义如下:
java 代码
  1. public class DefaultLineSpliter implements {
  2. public String defaultSpliterRegx = ",";
  3. public String getSpliterRegx() {
  4. return defaultSpliterRegx ;
  5. }
  6. public String[] split(String lineData) {
  7. return StringUtils.splitPreserveAllTokens(lineData,defaultSpliterRegx );
  8. }
  9. }
这里使用apache的Lang包进行处理,没有使用JDK的String的split方法,因为jdk的实现会将末尾空的字段过滤掉,造成数据减少...
比如:如果行数据为aaa,bbb,,,,, 通过jdk的实现会返回aaa和bbb,而通过Lang包处理会返回包括后面空的字段.

2、接下来使用DigesterDigester包根据xml规则生成对象..
首先需要了解digester包的使用方法,这里简单的说一下:disgeter可以根据一定的规则将xml文件解析成一组对象...具体这里,我先定义
一个规则文件,
xml 代码
  1. <digester-rules>
  2. <pattern value='XXXFileMeta'>
  3. <object-create-rule classname="com.xxx.file.DefaultFileMeta"/>
  4. <set-properties-rule/>
  5. <pattern value="field">
  6. <object-create-rule classname="com.xxx.file.DefaultFieldMeta"/>
  7. <set-properties-rule/>
  8. <bean-property-setter-rule pattern="beanname1"/>
  9. <bean-property-setter-rule pattern="beanname2"/>
  10. <bean-property-setter-rule pattern="beanname3"/>
  11. <bean-property-setter-rule pattern="beanname4"/>
  12. <!---->pattern>
  13. <!---->digester-rules>
这就是一个简单的规则定义,具体含义这里不详细讲了,想了解的可以给我回帖...
接着定义缺省的文件元数据文件,格式如下:
xml 代码
 
  1. <DefaultFileMeta name="com.xxx.file.DefaultFileMeta">  
  2.     <field>  
  3.         <beanname1>Codebeanname1>  
  4.         <beanname2>Namebeanname2>  
  5.         <beanname3>Datebeanname3>  
  6.         <beanname4>Remakebeanname4>  
  7.     field>  
  8. DefaultFileMeta>  

最后实例化digester对象,加载规则文件,解析文件元数据文件,则会动态生成根据元数据文件解析的格式定义.

代码如下:GeneratorObject.createObject(){}
初始化CGLib
java 代码
  1. @SuppressWarnings("unchecked")
  2. private void init(Class target, FileMeta fileMeta) {
  3. List<fieldmeta></fieldmeta> fields = fileMeta.getFieldMeta();
  4. String[] getters = new String[fields.size()];
  5. String[] setters = new String[fields.size()];
  6. Class[] types = new Class[fields.size()];
  7. try {
  8. for (int i=0; i < fields.size(); i++) {
  9. FieldMeta fieldMeta = fields.get(i);
  10. getters[i] = "get" + ConverterUtils.upperCaseFirstChar(fieldMeta.getName());
  11. setters[i] = "set" + ConverterUtils.upperCaseFirstChar(fieldMeta.getName());
  12. types[i] = Class.forName(fieldMeta.getType());
  13. }
  14. } catch(ClassNotFoundException e) {
  15. logger.error("类没有找到.." + e.getMessage());
  16. }
  17. this.bulkBean = BulkBean.create(target, getters, setters, types);
  18. }
根据指定的目标类动态生成对象
java 代码
  1. @SuppressWarnings("unchecked")
  2. private Object createObject(Class target, FileMeta fileMeta, Object[] values) {
  3. Object targetObject = null;
  4. try {
  5. targetObject = target.newInstance();
  6. } catch (Exception e){
  7. logger.error("创建对象出错,目标类-->" + target.getName(), e);
  8. }
  9. bulkBean.setPropertyValues(targetObject, values);
  10. return targetObject;
  11. }
解析文本文件
java 代码
  1. @SuppressWarnings("unchecked")
  2. public List createObjects() {
  3. //初始化BulkBean
  4. init(targetClass, fileMeta);
  5. List result = new ArrayList();
  6. LineIterator iterator = null;
  7. try {
  8. iterator = FileUtils.lineIterator(this.dataFile, DEF_ENCODING);
  9. while(iterator.hasNext()) {
  10. String line = iterator.nextLine();
  11. //过滤掉数据文件中的空行
  12. if (StringUtils.isBlank(line)) {
  13. continue;
  14. }
  15. Object[] values = this.parseLine(line, fileMeta);
  16. Object object = createObject(this.targetClass, fileMeta, values);
  17. result.add(object);
  18. }
  19. } catch (IOException e) {
  20. logger.error("读取文件名出错!-->" + this.dataFile.getName(), e);
  21. } finally {
  22. LineIterator.closeQuietly(iterator);
  23. }
  24. return result;
  25. }
最终返回解析好的文本文件对象列表..
本例综合使用了apache的代码包,灵活实现了文本文件的解析...
分享到:
评论
13 楼 godson_2003 2007-11-30  
楼主能不能把.txt转xml的代码贴全了啊?

谢谢
12 楼 godson_2003 2007-11-18  
好东西

对楼主的东西很感兴趣

楼主能不能发个demo上来啊
11 楼 kusix 2007-11-07  
<pattern value="dicts">
			<object-create-rule classname="java.util.ArrayList" />
			<pattern value="dict">
				<object-create-rule classname="test.digester.Dict" />
				<bean-property-setter-rule pattern="dictName" />
				<set-next-rule methodname="add" />
			</pattern>
			<set-next-rule methodname="setDicts" />
		</pattern>


List很好搞啊,Map就很困难了,必须要用变通的办法才行

set-next-rule居然不支持多个参数,有点郁闷
10 楼 jvincent 2007-11-07  
不一定非要是Map啊,List也可以.....
9 楼 kusix 2007-11-07  
非的把对象搞成
public void addDict(Dict dict) {
		dictMap.put(dict.getDictName(),dict);
	}


这样的,才行,感觉很别扭。
8 楼 kusix 2007-11-07  
试了一下digester,找了半天,没发现怎么调用Map的put方法,

也就是说,<set-next-rule methodname="add"/>

这个标签,只能调用参数数目是1的方法,怎么才能调用1个以上参数的方法呢?

call-method-rule 貌似只能调用自身的方法,无法调用父亲的方法

7 楼 jvincent 2007-11-06  
kusix 写道
从LZ这学到一招了,Digester,不错,回去试试  以前不想自己写配置文件的解析,都是拿spring来做的。  现在也在做这方面的东西,  感觉TXT如果只是分割符变化了,还比较好对付,  但是如果是格式彻底变了呢,比如行列的位置都变换了,  你抽象的这个构架该怎么对付呢?
<br/>
<br/>
如果行列的位置变了,只需要在xml配置文件里面调整一下顺序就可以了...这也是digester的主要作用,动态生成格式文件...
6 楼 Tom是只猫 2007-11-06  
Digester解析XMl用的
5 楼 kusix 2007-11-06  
从LZ这学到一招了,Digester,不错,回去试试

以前不想自己写配置文件的解析,都是拿spring来做的。

现在也在做这方面的东西,

感觉TXT如果只是分割符变化了,还比较好对付,

但是如果是格式彻底变了呢,比如行列的位置都变换了,

你抽象的这个构架该怎么对付呢?
4 楼 jvincent 2007-11-06  
<p>
coolnight 写道
呃 有没有搞错 这么简单的任务 写了这么多代码
</p>
<p><font>主要是为了解决文件格式的变化给系统带来的麻烦...如果针对每种格式文本文件都实现一个解析方法,难道不怕麻烦吗??</font></p>
3 楼 coolnight 2007-11-06  

呃 有没有搞错 这么简单的任务 写了这么多代码
2 楼 raindew 2007-11-05  
楼主笔误,应该是Digester吧.呵呵.
1 楼 ldjsyl 2007-11-05  
disgeter包,这个包是什么啊?百度和google都没搜到

相关推荐

    Java解析txt文件到数据库

    总结一下,Java解析TXT文件到MySQL数据库的过程主要包括:1)解压ZIP文件;2)读取并解析TXT文件;3)创建或连接到MySQL数据库;4)构建并执行SQL插入语句。这个过程可以扩展到处理任意数量的TXT文件,只需适当调整...

    C#读取解析txt文件,可以读取多或全选txt文件,实测管用

    在C#编程中,读取和解析TXT文件是一项常见的任务,尤其在处理大量文本数据时。本示例将深入探讨如何使用C#有效地读取单个或多个TXT文件,并进行内容解析与筛选。 首先,我们可以使用`System.IO`命名空间中的`...

    解析txt类型的试题文档

    本话题聚焦于"解析txt类型的试题文档",这是一个使用Java编写的程序,它的主要功能是解析txt格式的试题文档,并将这些数据转换成XML文档。让我们深入探讨这个过程涉及的技术点。 首先,txt文件是一种常见的纯文本...

    C语言txt文件解析.zip

    本资源"**C语言txt文件解析.zip**"提供了一种使用C语言读写TXT文件的方法,特别关注如何处理字符串拆分,以及根据行列号选取特定内容。下面将详细介绍这个主题及其相关知识点。 首先,`readTXT.cpp`是C++源代码文件...

    PB实时读取txt文件

    在实现PB实时读取txt文件的过程中,开发者可能会使用到的关键技术包括文件系统监视(如Windows的FindFirstChangeNotification函数)、异步I/O操作,以及PowerBuilder的事件驱动编程模型。通过监听文件系统的变更事件...

    自动解析文件,不用数据库自动将txt中进行单词筛选

    在本例中,我们的目标是筛选TXT文件中的单词,因此解析过程主要涉及识别和分离字符串中的单词。 步骤1:读取TXT文件 使用编程语言(如Python)的内置函数可以轻松读取TXT文件。例如,在Python中,可以使用`open()`...

    从txt文件中读取内容进行解析存储到sqlite中

    本话题主要关注如何从TXT文件中提取内容,对其进行解析,并将这些数据存储到SQLite数据库中。SQLite是一个轻量级、自包含的数据库引擎,适用于嵌入式应用或者作为桌面系统的本地数据库解决方案。以下是关于这个过程...

    Java解析FTP服务器文本文件

    Java解析FTP服务器文本文件 Java解析FTP服务器文本文件是指使用Java语言连接FTP服务器,上传、下载、递归目录遍历等基本操作的集合。在这个过程中,我们需要引入相关的jar包,例如cpdetector.jar、jchardet-1.0.jar...

    Android代码-解析word文档过程详细易懂代码可直接复用.zip

    3. **"JavaApk源码说明.txt"**:这个文件可能包含了关于示例项目源码的详细说明,包括关键类和方法的作用,以及如何将这些代码整合到自己的项目中的指导。阅读这份文档可以帮助开发者更快地理解和复用提供的代码。 ...

    oui.txt 网卡查询 txt文件解析

    "oui.txt 网卡查询 txt文件解析"这个主题就聚焦于如何处理和解析这种特定类型的文本文件,以便获取关于网络接口控制器(NICs)的制造商信息。OUI,全称为Organizationally Unique Identifier,是由IEEE分配给各制造...

    scel词库转换为txt文件.zip

    4. 将解析出的文本信息格式化为TXT文件所需的样式。 5. 创建一个TXT文件,将格式化的信息写入其中。 6. 最后,关闭文件并完成转换。 标签中的“txt”表明了转换的目标格式,TXT文件由于其简单性和通用性,广泛应用...

    CTest_文档解析;文件读取;字符串划分_VS2015txt_

    在这个项目“CTest”中,可能的实现是创建一个程序,它打开一个txt文件,逐行读取内容,然后对每一行进行字符串划分,可能是为了提取特定信息或者进行数据分析。例如,如果txt文件包含CSV格式的数据,程序可能会将每...

    bmp文件读出为txt文件, txt文件写入为bmp文件

    1. 解析TXT:读取TXT文件,识别出各部分的二进制数据表示,如宽度、高度、颜色深度等。 2. 构建文件头:根据解析的数据,构建对应的文件头和信息头。 3. 重组像素数据:按照BMP文件格式的规则,重新组织像素数据。...

    C#提取二进制STL文件并生成TXT文件

    这样,我们就完成了从二进制STL文件提取数据并生成TXT文件的过程。需要注意的是,实际的STL文件可能存在字节序问题,因为STL文件格式不规定字节序。如果在不同平台上遇到问题,可能需要进行字节序的转换,例如使用`...

    python json文件转txt文件,批处理json文件转换成一个txt文件

    标题中的"python json文件转txt文件,批处理json文件转换成一个txt文件",指的是使用Python编写脚本来读取多个JSON文件,解析其内容,并将数据写入到TXT文件中。这通常涉及到以下步骤: 1. **导入必要的库**:首先...

    PDB文件转TXT文件工具

    本文将详细介绍如何使用“PDB文件转TXT文件工具”将PDB内容转换为TXT文档,以便于阅读和分析。 首先,让我们了解这个工具的核心功能。"PDB-TXT.exe"是一个执行程序,它的设计目的就是将PDB文件中的信息抽取出来,并...

    bin文件转txt文件工具

    "bin文件转txt文件工具"就是这样一个实用程序,它专为将二进制(bin)文件转换成文本(txt)文件而设计。这个工具由Visual Studio 2010开发,能够处理任意大小的bin文件,使得数据的解析和读取变得更加容易。 首先...

    读取文件数据并解析成bean实体类

    2. **数据解析**:数据解析是将文件内容转换为可操作结构的过程。这可能涉及到XML、JSON、CSV等数据格式的解析。例如,对于XML,可以使用`javax.xml.parsers.DocumentBuilderFactory`和`org.w3c.dom.Document`进行...

    C++_C++_读取txt文档_txt内容读取_按空格分隔_按逗号分隔_

    1. **打开txt文档**:首先,创建一个ifstream对象并使用open()函数打开txt文件。你需要提供文件的路径作为参数。例如: ```cpp #include std::ifstream inputFile("path_to_your_file.txt"); ``` 如果文件成功...

    HEX文件转化成Txt文件工具_HEX2Txt.rar

    综合以上信息,我们可以理解这个工具的工作原理:它读取HEX文件,解析其中的十六进制数据,然后按照用户选择的大小(1byte、2byte或4byte)将其转换为对应的数值,并逐行写入TXT文件。这个过程对于那些需要处理或...

Global site tag (gtag.js) - Google Analytics