Чтение данных из текстового файла, плохо написанный текстовый файл - PullRequest
0 голосов
/ 25 января 2012

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

Вот две такие строки, для обеих я могу получить переменные адреса, широты и долготы, нона втором я не могу получить цену или размер (ы).ошибка, которую я продолжаю получать, это исключение строки за пределами -41 (серьезно)

|12091805|,|0|,|DETAILS|,||,||,|Latitude:54.593406, Longitude:-5.934344 <b >Unit 8 Great Northern Mall Great Victoria Street Belfast Down<//b><p><p><p>Price : 150,000<p>Size: 2,411 Sq Feet  ()<p>Rent : 50,500 Per Annum<p><p>Text<p><p>|,||,||

|15961081|,|0|,|DETAILS|,||,||,|<p>Latitude:54.593406, Longitude:-5.934344   <b>3-5 Market Street Lurgan BT66</b> </p>  <p> </p>  <p> </p>  <p>   Price : &pound;250,000 </p>  <p>   Size: 0.173 acres (0.07ha) </p>  <p> </p>  <p>   Text </p>  <p> </p>  <p>  Text </p>  <p> </p>  <p>   Text </p>  <p> </p>  <p> </p>|,||,||

Это намного дольше, но я изменил абзацы, чтобы сказать текст на данный момент.

Инет, я не могу переписать текстовый файлЛюбые указатели будут оценены

if (s.contains("Price"))
{
    int pstart = 0;
    int pend = 0;

    if (s.contains("<p>Size"))
    {

        //if has pound symbol
        if (s.contains("&pound;"))
        {
            String[] str = s.split("&pound;");
            StringBuilder bs = new StringBuilder();
            for (String st : str)
            {
                bs.append(st);
            }

            pstart = bs.indexOf("Price") + 8;
            pend = bs.indexOf("</p>") - 1;
        }
        else
        {
            pstart = s.indexOf("Price") + 8;
            pend = s.indexOf("<p>Size");
        }

        String sp = s.substring(pstart, pend);

        String[] spl = sp.split(",");
        StringBuilder build = new StringBuilder();
        for (String st : spl)
        {
            build.append(st);
            f = build.toString();
        }
        in = Integer.parseInt(f);
        p.setPrice(in);
    }
    else
    {
        if (s.contains("&pound;"))
        {
            String[] str = s.split("&pound;");
            StringBuilder bs = new StringBuilder();
            for (String st : str)
            {
                bs.append(st);
            }

            pstart = bs.indexOf("Price : ");
            pend = bs.indexOf("</p>") - 1;
        }
        else
        {
            pstart = s.indexOf("Price") + 8;
            pend = s.indexOf("<p>Size");
        }

        String sp = s.substring(pstart, pend);

        String[] spl = sp.split(",");
        StringBuilder build = new StringBuilder();
        for (String st : spl)
        {
            build.append(st);
            f = build.toString();
        }
        in = Integer.parseInt(f);
        p.setPrice(in);
    }
}

// if has size property
if (s.contains("Size"))
{
    //if in acres
    if (s.contains("acres"))
    {
        int sstart = s.indexOf("Size:") + 6;
        int send = s.indexOf("acres") - 1;

        String sp = s.substring(sstart, send);
        double d = Double.parseDouble(sp);

        p.setSized(d);

    }

    if (s.contains("()"))
    {
        int sstart = s.indexOf("Size:") + 6;

        int send = s.indexOf("Sq") - 2;

        String sp = s.substring(sstart, send);

        if (sp.contains("-") && sp.contains(","))
        {
            String[] spl = sp.split("-|,");

            StringBuilder str = new StringBuilder();
            str.append(spl[0] + spl[1]);

            StringBuilder str2 = new StringBuilder(0);
            str2.append(spl[2] + spl[3]);

            String s1 = str.toString();
            int i = Integer.parseInt(s1);
            p.setSize(i);

            String s2 = str2.toString();
            i = Integer.parseInt(s2);
            p.setSize2(i);
        }

        if (sp.contains("-"))
        {
            String[] spl = sp.split("-");

            int one = Integer.parseInt(spl[0]);

            p.setSize(one);

            int two = Integer.parseInt(spl[1]);

            p.setSize2(two);

        }
        else if (!(sp.contains("-")))
        {
            if (sp.contains(","))
            {
                String[] spl = sp.split(",");
                StringBuilder build = new StringBuilder();
                for (String st : spl)
                {
                    build.append(st);
                    f = build.toString();
                }
                in = Integer.parseInt(f);
                p.setSize(in);
            }
            else
            {
                p.setSize(Integer.parseInt(sp));
            }

        }

    }

}
v.add(p);
p = new Property();

Ответы [ 2 ]

1 голос
/ 25 января 2012

Я бы использовал регулярные выражения, следующее должно указать вам правильное направление:

Pattern pricePattern = Pattern.compile("Price\\s*:\\s*(&pound;)?([0-9,.]+)"); 
Pattern sqFeetPattern = Pattern.compile("Size\\s*:\\s*([0-9,.]+)\\s*Sq"); 
Pattern acresPattern = Pattern.compile("Size\\s*:\\s*([0-9,.]+)\\s*acres\\s*\\(([0-9,.]+)ha\\)"); 

NumberFormat nf = NumberFormat.getNumberInstance();
nf.setGroupingUsed(true);

BufferedReader r = new BufferedReader(inputFileReader);
String line;
while ((line = r.readLine()) != null) {
    Matcher m = pricePattern.matcher(line);
    if (m.find()) {
        int price = nf.parse(m.group(2)).intValue();
        System.out.println("Price: " + price);
    }
    m = sqFeetPattern.matcher(line);
    if (m.find()) {
        int sqFeet = nf.parse(m.group(1)).intValue();
        System.out.println("Sq Feet: " + sqFeet);
    }
    m = acresPattern.matcher(line);
    if (m.find()) {
        float acres = nf.parse(m.group(1)).floatValue();
        float ha = nf.parse(m.group(2)).floatValue();
        System.out.println("Acres: " + acres + " ha: " + ha);
    }
}

N.B. inputFileReader будет определен как FileReader или аналогичный для получения вашего файла.

0 голосов
/ 25 января 2012

Я бы выбрал следующий подход:

  1. Считать строку текста
  2. Декодировать строку текста - выглядит как разметка HTML, поэтому преобразуйте экранированные символы (&pound; дляпример) к эквивалентному текстовому символу и отфильтровать разметку HTML (<p> и т. д.)
  3. Выполнить извлечение данных из очищенных данных с помощью регулярных выражений
  4. Данные процесса
  5. Следующая строка или конец.

Для шага 2 что-то вроде этого - то, о чем я думаю.Таким образом, вы удаляете всю html-разметку из строки перед тем, как разбить ее на разделитель полей (|)

Удалить теги HTML из строки

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