Чтение текстового файла без разделителей в java через flatpack

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

Решение
    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"));
            }

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

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

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, а затем следующий символ - это позиция 1, а затем 2 ... и так далее.

Тогда все строки с данными шириной от 0 до 7 символов будут называться "Prod Name" и будут возвращать samsungA.

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

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

И вы можете сделать это без Flatpack.

Другие вопросы по тегам