Какой лучший способ для анализа файла в Java - PullRequest
2 голосов
/ 18 июня 2010

У меня есть текстовый файл с данными формата Tag - Value. Я хочу проанализировать этот файл, чтобы сформировать Trie. Какой будет лучший подход?

Образец файла: (Строка внутри "" - это тег, а "#" используется для комментирования строки.)

 #Hi, this is a sample file.

"abcd" = 12;
"abcde" = 16;
"http" = 32;
"sip" = 21;

Ответы [ 4 ]

5 голосов
/ 18 июня 2010

Прочтите это при использовании Свойства и обрежьте лишние части (", ; и пробелы). Краткий пример:

Properties props = Properties.load(this.getClass()
                                       .getResourceAsStream("path/to.file"));
Map<String, String> cleanedProps = new HashMap<String, String>();
for(Entry pair : props.entrySet()) {
    cleanedProps.put(cleanKey(pair.getKey()),
                     cleanValue(pair.getValue()));
}

Обратите внимание, что в приведенном выше решении вам нужно только реализовать cleanKey() и cleanValue() самостоятельно. Вы можете изменить типы данных соответственно, если необходимо, я использовал строки в качестве примера.

5 голосов
/ 18 июня 2010

Это в основном файл свойств, я бы удалил "вокруг тегов", а затем использовал класс Properties http://java.sun.com/javase/6/docs/api/java/util/Properties.html#load(java.io.Reader) для загрузки файла.

1 голос
/ 18 июня 2010

Есть много способов сделать это;другие упоминали, что java.util.Properties выполняет большую часть работы и, вероятно, является наиболее надежным решением.

Еще один вариант - использовать java.util.Scanner.

  • Используйте конструктор Scanner(File) для сканирования файла
  • Вы можете useDelimiter, подходящий для этого формата
  • nextInt() может использоваться для извлечения чисел
  • Возможно, вы можете поместить пары ключ / значение в SortedMap<String,Integer>

Вот пример, который сканирует String для простоты:

    String text =
        "#Hi, this is a sample file.\n" +
        "\n" +
        "\"abcd\" = 12; \r\n" +
        "\"abcde\"=16;\n" + 
        "  # \"ignore\" = 13;\n" +
        "\"http\" = 32;  # Comment here \r" + 
        "\"zzz\" = 666;  # Out of order! \r" + 
        "   \"sip\"  =  21 ;";

    System.out.println(text);
    System.out.println("----------");

    SortedMap<String,Integer> map = new TreeMap<String,Integer>();
    Scanner sc = new Scanner(text).useDelimiter("[\"=; ]+");
    while (sc.hasNextLine()) {
        if (sc.hasNext("[a-z]+")) {
            map.put(sc.next(), sc.nextInt());
        }
        sc.nextLine();
    }
    System.out.println(map);

Это печатает (, как видно на ideone.com ):

#Hi, this is a sample file.

"abcd" = 12; 
"abcde"=16;
  # "ignore" = 13;
"http" = 32;  # Comment here 
"zzz" = 666;  # Out of order! 
   "sip"  =  21 ;
----------
{abcd=12, abcde=16, http=32, sip=21, zzz=666}

Смежные вопросы

См. Также

0 голосов
/ 18 июня 2010

Самый естественный способ, вероятно, таков:

void doParse() {
        String text =
                "#Hi, this is a sample file.\n"
                + "\"abcd\" = 12;\n"
                + "\"abcde\" = 16;\n"
                + "#More comment\n"
                + "\"http\" = 32;\n"
                + "\"sip\" = 21;";

        Matcher matcher = Pattern.compile("\"(.+)\" = ([0-9]+)").matcher(text);
        while (matcher.find()) {
            String txt = matcher.group(1);
            int val = Integer.parseInt(matcher.group(2));
            System.out.format("parsed: %s , %d%n", txt, val);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...