Я хочу читать данные из текстового файла в 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
Любое мнение о том, как этого добиться?




Вы можете сделать это с помощью простого чтения файлов. Ваш файл разделен пробелами; каждая строка заканчивается символом новой строки в соответствии с вашим примером.
Таким образом, вам просто нужно выполнить небольшую арифметику для расчета индексов, поскольку у вас есть информация о цене, почтовом индексе и дате в третьей части каждой строки.
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 написано «Лондон», а затем - «Калифорния», и у вас могут быть более широкие названия. Итак, вам нужно знать или вам нужно найти максимальную позицию, которая заканчивается данными для каждого столбца данных.
И вы можете обойтись без упаковки.
Спасибо, придумаю код и сообщу
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"));
}
Спасибо, пойму и применим.