2014-12-03 3 views
2

Хорошо, поэтому я хочу читать вещи из файла. Они выглядят так:пытается проанализировать входы, которые идут int string string char int

70   Fresno Credit Bureau    Fresno   CA   93714 

И я хочу, чтобы это было в части, с 70 собираются на междунар, Fresno Credit Bureau и Fresno идти в отдельные строки, государственные инициалы в отдельные голец, и, наконец, кормление этот последний zip-код в другой int.

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

while(gre.hasNextLine()){ 
      imidate = gre.nextInt(); 
      gre.skip(" "); 
      han = gre.next(); 
      gre.skip(" "); 
      luke = gre.next(); 
      gre.skip(" "); 
      bok = gre.next().charAt(0); 
      mander = gre.next().charAt(1); 
      gre.skip(" "); 
      imate = gre.nextInt(); 
      theTree.addNode(imate, han, luke, bok, mander, imidate); 
     } 

Который, вероятно, щуря на разборе где-то, от взглядов, но я не могу сказать, где. Какие-либо предложения? Комментарии? Опасения?

+0

Это те вкладки, или это файл с определенным количеством символов для полей? Есть ли у Java разделение строк, которое будет разделяться на вкладках и создавать массив, например, C#? – Nikki9696

+0

@ Nikki9696 Да Nikki, есть строка java split. Вам просто нужно передать какую-то строку для поиска. – CBredlow

+0

Не используйте сканер.Прочитайте строку за раз и разделите ее на столбцы на основе позиции символа или вкладок или что угодно. –

ответ

1

Похоже, вы хотите разрешить пробелы внутри ваших строк, обрабатывая 2+ пространства в качестве разделителей. Для того, чтобы работать, вы должны установить соответствующий шаблон для разделителей Scanner «s:

Scanner gre = ... 
gre.useDelimiter("\\s{2,}"); 

Теперь вызов next будет игнорировать пробелы внутри Fresno Credit Bureau, преодолев только на двух или более пробелов.

Это позволит вам избавиться от звонков skip, потому что Scanner пропускает разделители.

Demo.

Наконец, этот кусок кода выглядит подозрительно:

bok = gre.next().charAt(0); 
mander = gre.next().charAt(1); 

Если вы пытаетесь захватить первый и второй символы одного и того же маркера, храните его в String перед вызовом charAt(). В противном случае вы бы доступ символов из двух разных лексем:

String tok = gre.next(); 
bok = tok.charAt(0); 
mander = tok.charAt(1); 
0

Split линия в строку [], то вы можете поместить элементы массива строк в вашем переменные.

Как:

String[] line = gre.split("\\s+"); 
imidate = Integer.parseInt(line[0]); 
han = line[1]; 
etc ... 
0

Поскольку каждая строка состоит из объектов различных типов, вероятно, вы должны иметь класс справиться с этим. Например,

class MyObject { 
    int number; 
    String name; 
    String city; 
    char[] state; 
    int zip; 

    public static MyObject fromLine(String line) { 
     String[] columns = line.split("\\s{2,}"); 
     number = Integer.parseInt(columns[0]); 
     name = columns[1]; 
     city = columns[2]; 
     state = columns[3].toCharArray(); 
     zip = Integer.parseInt(columns[4]); 
    } 
} 

Если каждая строка в файле выглядит, как в вашем вопросе, вы можете прочитать файл построчно с помощью сканера или BufferedReader, а затем рассматривать обработку каждой линии отдельно. Используя BufferedReader, вы можете сделать следующее:

try (BufferedReader reader = new BufferedReader(new FileReader(vocabulary))) { 
     List<MyObject> myObjects = reader.lines() 
             .map(MyObject::fromLine) 
             .collect(Collectors.toList()); 
} catch (IOException e) { } 

Если вы используете вкладки, а затем использовать "\\t+" вместо "\\s{2,}".

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