0

我想从 java 中的文本文件中读取数据,但文本文件在某些​​文本之后不包含任何分隔符,如空格或逗号。有人告诉我,它可以通过 flatpack 实现。

那么我如何阅读文本并将其解析为分隔并存储它们。

例如文本文件数据

"Prod Name" "City" "Price" "zipcode" "Date"

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

我想存储:为:

Name in string  
City in string  
Price in int  
zipcode in int  
date as date

关于如何实现这一目标的任何看法?

4

3 回答 3

0

您可以使用简单的文件阅读器来完成此操作。您的文件由空格分隔;根据您的示例,每一行都以换行符结尾。

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

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));
    }
}
于 2018-05-28T22:45:45.267 回答
0

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

然后你应该说在文件的开头你有位置 0 然后下一个字符是位置 1 然后是 2 ...等等。

然后,所有包含 0 到 7 个字符宽的数据的行都是“产品名称”,并将返回 samsungA。

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

所以前提是要知道每个数据列有多少个字符宽。例如,第 1 行有“London”,然后是“California”,您可以使用更广泛的名称。所以你需要知道或者你需要找到每个数据列结束数据的最大位置。

你可以在没有扁平包装的情况下做到这一点。

于 2018-05-28T22:45:58.657 回答
0
    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"));
            }
于 2018-06-21T09:27:46.883 回答