Чтение текстового файла без разделителей в java через flatpack - PullRequest
0 голосов
/ 29 мая 2018

Я хочу прочитать данные из текстового файла в 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

Любое мнение о том, как этого добиться?

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Я думаю, что использовать плоский пакет или нет, это не проблема.Если файл не содержит разделителей, то вы должны просмотреть таблицу как файл, построенный из столбцов данных, и прочитать его с определением позиции символа.

Вы должны сказать, что в начале файла у вас есть позиция0, а затем следующий символ - это позиция 1, а затем 2 ... и т. Д.

Тогда все строки, содержащие данные в диапазоне от 0 до 7 символов включительно, являются "именем продукта" и возвращают samsungA.

От символов 9 до 18 (при условии, что 18 - максимальная позиция) вы должны прочитать записи «Город».

Поэтому необходимо знать, сколько символов в ширину составляет каждый столбец данных.Например, в строке 1 есть «Лондон», а затем «Калифорния», и у вас могут быть более широкие имена.Так что вам нужно знать или вам нужно найти максимальную позицию, в которой заканчиваются данные для каждого столбца данных.

И вы можете сделать это без плоской упаковки.

0 голосов
/ 21 июня 2018
    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 голосов
/ 29 мая 2018

Вы можете сделать это с помощью простого файлового ридера.Ваш файл разделен пробелами;каждая строка заканчивается символом новой строки в соответствии с вашим примером.

Таким образом, вам просто нужно сделать небольшую арифметику, чтобы вычислить индексы, поскольку у вас есть информация о цене, почтовом индексе и дате в третьей части каждогоряд.

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));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...