Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ? / 8 сообщений из 8, страница 1 из 1
15.09.2013, 19:50:53
    #38397112
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ?
hi

Необходимо прочесть входной файл и вытряхнуть из него только слова, отослав в игнор все переводы строки и знаки препинания.
В следующем коде проблема в row.split(ptn): для строки, содержащей только разделитель из шаблона, возвращается массимв длины 1, а не 0.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
import java.util.*;
import java.io.*;
import java.util.regex.*;

class WordsOnly2 {
  public static void main(String[] args) {
    new WordsOnly2().go();
  }
  void go() {
    BufferedReader br;
    List<String> a = new LinkedList<String>();

    String row, ptn;
    // ptn="[\\p{Punct}*\\s]+";
    //ptn="\\s+";
    ptn="\\W+";

    String src="C:\\gutenberg.txt";
    String tgt="C:\\gutenberg.tmp";
    try {
      br = new BufferedReader(new FileReader(src));
      while ( (row=br.readLine()) != null ) {
        System.out.println("row=>"+row+"< length="+row.split(ptn).length+", size="+Arrays.asList(row.split(ptn)).size() );
        a.addAll( Arrays.asList(row.split(ptn)) );
      }
      br.close();
    } catch(Exception x) { x.printStackTrace(); }
  }
}


Входной файл:
Код: plaintext
1.
2.
3.
4.
5.
6.
The Project Gutenberg EBook of The King James Bible





This eBook is for the use of anyone
(NB: между первой и второй строками - несколько подряд переводов).

Output:
Код: plaintext
1.
2.
3.
4.
5.
6.
row=>The Project Gutenberg EBook of The King James Bible< length=9, size=9
row=>< length=1, size=1
row=>< length=1, size=1
row=>< length=1, size=1
row=>< length=1, size=1
row=>< length=1, size=1
row=>This eBook is for the use of anyone< length=8, size=8

Надо что-то подсунуть в шаблон ptn, чтобы для row=>< (а на самом деле это перевод строки) row.split(ptn).length был = 0.
Понятно, что можно предварительно проверять строку "на непусто", но хотелось бы обойтись без лишних операторов.

Подскажите, плз, можно ли это сделать.
...
Рейтинг: 0 / 0
15.09.2013, 23:54:28
    #38397190
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ?
... вроде бы не получится :( http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#split(java.lang.String, int) If the expression does not match any part of the input then the resulting array has just one element, namely this string .
...
Рейтинг: 0 / 0
16.09.2013, 04:16:32
    #38397244
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ?
ozzmosis
Код: java
1.
ptn="\\W+";

С этим паттерном все работает
...
Рейтинг: 0 / 0
16.09.2013, 13:33:27
    #38397651
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ?
UsmanС этим паттерном все работаетНет. Множественные переводы строк не схлопываются в одинарный:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
import java.util.*;
import java.io.*;
import java.util.regex.*;

class WordsOnly2 {
  public static void main(String[] args) {
    new WordsOnly2().go();
  }
  void go() {
    BufferedReader br;
    BufferedWriter bw;
    List<String> a = new LinkedList<String>();

    String row, ptn;
    // ptn="[\\p{Punct}*\\s]+";
    //ptn="\\s+";
    ptn="\\W+";

    String src="C:\\gutenberg.txt";
    String tgt="C:\\gutenberg.tmp";
    try {
      br = new BufferedReader(new FileReader(src));
      while ( (row=br.readLine()) != null ) {
        System.out.println("row=>"+row+"< length="+row.split(ptn).length+", size="+Arrays.asList(row.split(ptn)).size() );
        a.addAll( Arrays.asList(row.split(ptn)) );
      }
      br.close();

      bw = new BufferedWriter(new FileWriter(tgt));
      for(String r : a) { 
        //bw.write(r+"\n"); // var-1
        bw.write(r); bw.newLine(); //  var-2
      }
      bw.close();

    } catch(Exception x) { x.printStackTrace(); }
  }
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
C:\>type gutenberg.tmp
The
Project
Gutenberg
EBook
of
The
King
James
Bible





This
eBook
is
for
the
use
of
anyone
...
Рейтинг: 0 / 0
16.09.2013, 18:44:53
    #38398025
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ?
ozzmosisМножественные переводы строк не схлопываются в одинарныйВсмысле, подряд идущих? Если так, то все схлопывается за раз:
Код: java
1.
2.
System.out.println(Arrays.toString("Hello, \r\nWorld\r\n\r\n\r\n234\r \r \r \r\n \n\n\n !!!".split("\\W+")));
// [Hello, World, 234]
...
Рейтинг: 0 / 0
16.09.2013, 19:04:55
    #38398046
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ?
Usman,

ну так почему тогда при чтении файла не схлопываются ? (при таком же паттерне, "\\W+").
Файлик - в аттаче.
...
Рейтинг: 0 / 0
16.09.2013, 19:33:33
    #38398076
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ?
ozzmosis,

Вы неправильно схлопывали. Нужно было так: ;)
Код: java
1.
2.
3.
4.
5.
6.
7.
BufferedReader br = new BufferedReader(...);
StringBuilder text = new StringBuilder();
while (br.ready()) {
	text.append(br.readLine());
}
br.close();
System.out.println(Arrays.toString(text.toString().split("\\W+")));

Или - для построчного считывания из файла:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
BufferedReader br = new BufferedReader(...);
while (br.ready()) {
	String line = br.readLine().trim();
	if (!line.isEmpty()) {
		for (String word: line.split("\\W+")) {
			System.out.println(word);
		}
	}
}
br.close();
...
Рейтинг: 0 / 0
16.09.2013, 19:44:08
    #38398081
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ?
Usman,

спасибо, буду пробовать.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Парсинг на слова via String.split(), шаблон для игнора задвоенных CR/LF. Какой ? / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]