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

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

Итак, как я могу читать текст и разбирать его как разделенные и сохраненные.

Например, данные текстового файла

"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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
296
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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));
    }
}

Спасибо, пойму и применим.

Dazel Mann 29.05.2018 08:14

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

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

Тогда все строки, содержащие данные от 0 до 7 символов включительно, будут «Prod Name» и вернут samsungA.

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

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

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

Спасибо, придумаю код и сообщу

Dazel Mann 29.05.2018 08:14
Ответ принят как подходящий
    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"));
            }

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