как разбирать текстовые файлы, где важен порядок - PullRequest
2 голосов
/ 18 ноября 2010

У меня проблемы с определением способа разбора данного текстового файла.

Вот запись в файле:

type = "book"
callnumber = "1"
authors = "a"
title = "t"
publisher = "p"
year = "2023"

каждая запись отделена строкой пробела(символ новой строки).

поэтому у меня есть эти переменные (тип, callnumber, авторы, заголовок ....), и мне нужно прочитать этот текст и определить, какие значения их устанавливать.Например, когда я читаю строку «callnumber = 1», мне нужно установить эту переменную равной 1.

Это то, что я имею до сих пор.Я читаю по одной строке за раз, например, type = "book", а затем разбиваю эту строку на массив строк с разделителем ", чтобы массив содержал type = и book. Теперь моя проблемадальше идет дальше. Я подумал, что могу циклически проходить каждую строку в массиве, символ за символом, пока не достигну пробела. Поэтому у меня будет type, но у меня еще нет данных для хранения в типеи захват даст мне book (игнорируя = и пробел), но как я могу приписать книгу к типу?

Итак, я ищу способ разбирать текстовый файл построчнои назначьте значения переменных, основываясь на найденных мной словах.

Спасибо.

Ответы [ 5 ]

7 голосов
/ 18 ноября 2010

Игнорируя текущий маршрут, почему бы не использовать Properties.load (InputStream inputStream)

Properties properties = new Properties();
properties.load(new FileInputStream("filename"));

string type = properties.getProperty("type");
System.out.println(type);

книга

1 голос
/ 18 ноября 2010

Я согласен, вам следует выбрать маршрут «Свойства», если ваши требования позволяют это сделать.Следующим лучшим вариантом будет работать с каждой строкой по отдельности через регулярное выражение.

 String type = "default";
 int callnumber = 0;


 String line = "type = \"book\"";
    // String line = "callnumber = \"1\"";
 Pattern linePattern = Pattern.compile("(\\w*) = \"(.*)\"");

 Matcher matcher = linePattern.matcher(line);
 if ( !matcher.matches() ) {
     System.err.println("Bad line");
 }

 String name = matcher.group(1);
 String value = matcher.group(2);

 if ( "type".equals(name) ) {
     type = value;
 } else if ( "callnumber".equals(name) ) {
     callnumber = Integer.parseInt(value);
 } //...

В вашем случае вы захотите интегрировать это в цикл while, который читает из файла, и заменить lineсо строкой, которую вы только что прочитали из файла.

0 голосов
/ 18 ноября 2010

Порядок переменных в текстовом файле всегда будет одинаковым?

Полагаю, вы бы не спросили, так ли это.

Почему бы и нетпросто создайте метод:

void assignVariableByName(String name, <type> value) {
    if(name.contains("type"))
        type = value;
    else if(name.contains("callnumber"))
        callnumber = value; 
}

Тогда используйте ->

У вас есть массив строк, которые вы разбили ... и вы вызываете

assignVariableByName(parsedLine[0],parsedLine[1]);
0 голосов
/ 18 ноября 2010

Присвоение значений переменным, вероятно, было сделано в другом месте более чисто.Однако, если вы хотите «токенизировать» вашу строку, используйте токенайзер строки.

Новая школа должна использовать метод split класса String.

token[] = line.split("\s++")

http://download.oracle.com/javase/6/docs/api/java/lang/String.html#split(java.lang.String)

Ниже приведен способ старой школы:

http://download.oracle.com/javase/1.4.2/docs/api/java/util/StringTokenizer.html

While(String line = someInput.readLine())

StringTokenizer st = new StringTokenizer(line)
while(st.hasMoreTokens)
{
  String token = st.nextToken()
  //branch on token command, skip token '=', and assign on values
}
0 голосов
/ 18 ноября 2010

Чтобы добавить к решению Аарона:

Properties.load(new FileInputStream("<fileName>"));

загрузит свойства и получит какое-либо конкретное свойство, например,

,

Properties.getProperty("type") 

дастты строчка "книга".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...