楼主: 欣水寓言

JSP如何实现对txt文件内容的选择性读取

[复制链接]
论坛徽章:
0
11#
 楼主| 发表于 2007-1-5 22:50 | 只看该作者
我现在用的方法是将读取到的数据
用replaceall来处理,将两个空格替换成一个空格,循环执行到字符串中不存在两个连续的空格
然后再用split来按空格分隔字段,效果是成功了
但是方法好像不是很好,因为数据多了会很占用资源和时间

不知道谁有更好的方法
你们说的正则是指什么正则?

使用道具 举报

回复
论坛徽章:
43
ITPUB元老
日期:2007-01-14 09:32:112011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:08开发板块每日发贴之星
日期:2011-08-29 01:01:012012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18
12#
发表于 2007-1-7 07:25 | 只看该作者
明白你为什么问把两个空格变成一个空格了,呵呵

还好,文本生成方面的程序没有考虑到什么对齐之类的padding问题,否则,简单的替换也不起作用的,呵呵

至于xml输出,并不是所有程序设计的时候都有这方面的考虑的,从另一方面讲,即便有这样的考虑,结果可能会更难办,不幸遇到过几次,颇让人伤脑筋,呵呵

对于正则表达式,难点主要在于汉字匹配(可能中文系统下没问题吧),其他的都比较简单。

import java.util.regex.*;

public class RegexpTest {

        private static Pattern pattern = Pattern.compile("\\s*([\\p{InCJK Unified Ideographs}||\\p{InCJK Unified Ideographs Extension A}||\\p{InCJK Compatibility Ideographs}||\\p{InCJK Compatibility Forms}||\\p{InEnclosed CJK Letters and Months}||\\p{InSmall Form Variants}||\\p{InBopomofo}||\\p{InBopomofo Extended}]*)\\s*([0-9]*)\\s*([0-9]{4}\\-[0-9]{1,2}\\-[0-9]{1,2})\\s*([0-9]{2}:[0-9]{2}:[0-9]{2})\\s*([0-9]{4}\\-[0-9]{1,2}\\-[0-9]{1,2})\\s*([0-9]{2}:[0-9]{2}:[0-9]{2})\\s*([0-9]{2}:[0-9]{2}:[0-9]{2})\\s([0-9]*)\\s*([\\p{InCJK Unified Ideographs}||\\p{InCJK Unified Ideographs Extension A}||\\p{InCJK Compatibility Ideographs}||\\p{InCJK Compatibility Forms}||\\p{InEnclosed CJK Letters and Months}||\\p{InSmall Form Variants}||\\p{InBopomofo}||\\p{InBopomofo Extended}]*)\\s*([0-9]*\\.[0-9]*)\\s*([0-9]*\\.[0-9]*)\\s*";

        public static void main(String[] args) throws Exception {

                String[] txt = new String[] {
                                "\u6bf3 59125566 2007-1-4 10:17:18 2007-1-4 10:18:06 00:00:48 1 \u6bf3 0.11 0.22",
                                "小明 59125566 2007-1-4 10:17:18 2007-1-4 10:18:06 00:00:48 1 市话默认 0.11 0.22\n",
                                new String("小强 59125566120 2007-1-4 10:25:06 2007-1-4 10:27:31 00:02:25 1 市话默认 0.11 0.22 \n".getBytes("UTF-8","UTF-8" };

                Matcher m = null;
                for (String s : txt) {
                        m = pattern.matcher(s);
                        if (m.matches()) {
                                for (int i = 1; i <= m.groupCount(); i++)
                                        System.out.printf("Group %s = %s\n",i,m.group(i));
                        } else {
                                System.out.printf("Error! String \"%s\" not matched!\n", s);
                        }
                }
       
        }
}


比较复杂的代码部分主要是汉字在unicode表中的分布了,因为汉字占用了不止一个unicodeblock,所以判断起来就比较繁琐了。

结果比较简单,11个组,当然如果需要对年月日,时间,分秒都要细分的话,可能组数会更多一些,或者如果有些字段不需匹配,也可以少一些。不过觉得这都是小问题,可以另外处理。

另外要说明的是,如果有字符集问题,可以参照代码中的处理,也可能不需要,在非中文系统下编译问题不大,却挺烦人,比写程序时间还长,呵呵
Group 1 = 小明
Group 2 = 59125566120
Group 3 = 2007-1-4
Group 4 = 10:25:06
Group 5 = 2007-1-4
Group 6 = 10:27:31
Group 7 = 00:02:25
Group 8 = 1
Group 9 = 市话默认
Group 10 = 0.11
Group 11 = 0.22


另,关于文中unicode block的名称,和正则表达式的标准,可以参见http://www.unicode.org/reports/tr18/#Simple_Word_Boundarieshttp://www.unicode.org/reports/tr18/#Character_Blocks

使用道具 举报

回复
论坛徽章:
43
ITPUB元老
日期:2007-01-14 09:32:112011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:08开发板块每日发贴之星
日期:2011-08-29 01:01:012012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18
13#
发表于 2007-1-7 07:29 | 只看该作者
如果实在觉得麻烦,可以用"([.^\\s]*)"试一下,只是不能保证有效罢了,呵呵

使用道具 举报

回复
论坛徽章:
43
ITPUB元老
日期:2007-01-14 09:32:112011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:08开发板块每日发贴之星
日期:2011-08-29 01:01:012012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18
14#
发表于 2007-1-7 07:37 | 只看该作者
我现在用split实现了按空格读取字段,问题就是分割的空格有几个,它就分成多少段了,很麻烦,所以不知道有没有更好的方法
大家再帮忙我想想看其他更好的办法


split也可以用正则表达式的,或与这样更好也说不定。
比如

String[] txt = new String[] {
                                "\u6bf3 59125566 2007-1-4 10:17:18 2007-1-4 10:18:06 00:00:48 1 \u6bf3 0.11 0.22",
                                "小明 59125566 2007-1-4 10:17:18 2007-1-4 10:18:06 00:00:48 1 市话默认 0.11 0.22\n"};

for(String s : txt){
                        String[] ss=s.split("\\s{1}+";
                        for(String s_:ss) System.out.println(s_);
                }



效果一样,但是简洁了很多,呵呵

使用道具 举报

回复
论坛徽章:
127
Heart of PUB
日期:2008-01-02 14:43:06问答徽章
日期:2013-10-16 18:19:34Jeep
日期:2014-02-17 05:11:352014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14阿斯顿马丁
日期:2013-09-08 00:03:55
15#
发表于 2007-1-7 21:01 | 只看该作者
这个可以用CSV来读……

使用道具 举报

回复
论坛徽章:
43
ITPUB元老
日期:2007-01-14 09:32:112011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:08开发板块每日发贴之星
日期:2011-08-29 01:01:012012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18
16#
发表于 2007-1-7 23:30 | 只看该作者
这个可以用CSV来读……


也不失为一个好办法

只是apache的poi似乎并不提供对csv格式的支持,恐怕还是要自己编码或者找找别的第三方包了,呵呵

使用道具 举报

回复
论坛徽章:
0
17#
发表于 2007-1-8 14:32 | 只看该作者
最初由 klyuan 发布
[B]

读取倒是不难的!!!
用StringTokenizer类来处理 [/B]


呵呵,我处理过类似的问题,是用正则的,性能不错。看到有些朋友讲要替换什么的,个人觉得不太可行,那样性能下降很大。

StringTokenizer没有用过,马上看看。

使用道具 举报

回复
论坛徽章:
35
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:022011新春纪念徽章
日期:2011-01-25 15:41:012011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-02-13 15:08:092012新春纪念徽章
日期:2012-02-13 15:08:092012新春纪念徽章
日期:2012-02-13 15:08:09
18#
发表于 2007-1-8 16:30 | 只看该作者
用正则不错嘛

使用道具 举报

回复
论坛徽章:
23
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14
19#
发表于 2007-1-13 22:58 | 只看该作者
倾向XML

使用道具 举报

回复
论坛徽章:
131
乌索普
日期:2017-09-26 13:06:30马上加薪
日期:2014-11-22 01:34:242014年世界杯参赛球队: 尼日利亚
日期:2014-06-17 15:23:23马上有对象
日期:2014-05-11 19:35:172014年新春福章
日期:2014-04-04 16:16:58马上有对象
日期:2014-03-08 16:50:54马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
20#
发表于 2007-1-14 18:28 | 只看该作者
最初由 billyren 发布
[B]倾向XML [/B]

不良倾向

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表