Чтение текстового файла без разделителей в 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.