首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过flatpack读取java中未定界的文本文件

通过flatpack读取java中未定界的文本文件
EN

Stack Overflow用户
提问于 2018-05-29 05:59:25
回答 3查看 333关注 0票数 0

我想从java的文本文件中读取数据,但是文本文件在一些文本之后不包含任何分隔符,如空格或逗号。有人告诉我通过扁平包装是可能的。

那么,我如何读取文本并将其解析为带分隔符并存储它们呢?

例如,文本文件数据

代码语言:javascript
复制
"Prod Name" "City" "Price" "zipcode" "Date"

samsungA London 65001402110/07/2018  
samsungA California 35001202122/08/2018  
samsungA Delhi 44001202112/08/2018

我想将:存储为:

代码语言:javascript
复制
Name in string  
City in string  
Price in int  
zipcode in int  
date as date

对如何实现这一点有什么看法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-21 17:27:47

代码语言:javascript
复制
    Well you can use parser, and xml schema to define the length of the required variables that way one can extract the required varaibles. But yes, those variables will have predefined length.
    String data= "samsungA500";
    String schema = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" + 
                    "<!-- DTD can be pulled from the Jar or over the web -->\r\n" + 
                    "<!DOCTYPE PZMAP SYSTEM  \"flatpack.dtd\" >\r\n" + 
                    "<!--<!DOCTYPE PZMAP SYSTEM \"http://flatpack.sourceforge.net/flatpack.dtd\"> -->\r\n" + 
                    "<PZMAP>\r\n" + 
                    "   <COLUMN name=\"std_name\" length=\"9\" />\r\n" + 
                    "   <COLUMN name=\"std_price\" length=\"3\" />\r\n" +  
                    "</PZMAP>";

InputStream mapping = new ByteArrayInputStream(schema.getBytes());
        InputStream dataStream = new ByteArrayInputStream(data.getBytes());    
Parser pzparser = DefaultParserFactory.getInstance().newFixedLengthParser(mapping, dataStream);
            DataSet ds = pzparser.parse();
while (ds.next()) {
                System.out.println(ds.getString("std_name"));
                System.out.println(ds.getInt("std_price"));
                System.out.println(ds.getString("std_name"));
            }
票数 0
EN

Stack Overflow用户

发布于 2018-05-29 06:45:45

你可以用一个简单的文件阅读器来做这件事。您的文件由空格分隔;根据示例,每行都以换行符结束。

因此,您只需要做一点算术来计算索引,因为您在每行的第三部分中有价格、邮政编码和日期信息。

代码语言:javascript
复制
public static void main(String...args) throws IOException {
    final File file = new File("/home/william/test.txt");
    final String delimiter = " ";
    final int dateStrLen = 10;
    final int postCodeLen = 6;

    BufferedReader br = new BufferedReader(new FileReader(file));
    String tmp;
    while ((tmp = br.readLine()) != null) {
        String[] values = tmp.split(delimiter);

        String name = values[0];
        String city = values[1];
        int dateStartPos = values[2].length() - dateStrLen;
        int postCodeStartPos = dateStartPos - postCodeLen;

        String date = values[2].substring(dateStartPos);
        String postCode = values[2].substring(postCodeStartPos, dateStartPos);
        String price = values[2].substring(0, postCodeStartPos);
        // do something with the data
        // you could store it with a dto or in arrays, one for each "column"
        System.out.println(String.format("name: %s; city: %s; price: %s; post-code: %s; date: %s", name, city, price, postCode, date));
    }
}
票数 0
EN

Stack Overflow用户

发布于 2018-05-29 06:45:59

我认为使用或不使用平板包装不是问题。如果文件不包含分隔符,那么您应该将表视为由数据列构建的文件,并使用字符位置定义读取它。

你应该说,在文件的开头,你有位置0,然后下一个字符是位置1,然后是2…诸若此类。

那么数据宽度在0到7个字符之间的所有行都是"Prod Name“,并将返回samsungA。

从第9个字符到第18个字符(假设18是最大位置),您应该阅读"City“的记录。

因此,先决条件是知道每个数据列有多少个字符宽。例如,第1行的名称是"London“,但随后是"California”,您可以使用更宽的名称。因此,您需要知道或找到每个数据列结束数据的最大位置。

而且你不需要平板电脑也能做到。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50573842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档