2013-12-06 3 views
0

, так что в последнее время у меня были проблемы с использованием нескольких разделителей в FileScanner. Я хотел бы сделать так, чтобы первые строки в моем файле разделялись запятыми, но перед тем, как перейти к следующей строке, нет запятой, только пробел. Это создает проблемы с назначением значений моим массивам.Как изменить разделитель файлаScan во время выполнения?

public class FileScan 
    { 
     public static void main(String[] args) throws IOException 
     { 
       String[] firstName = new String[50]; 
       String[] lastName = new String[50]; 
       String[] number = new String[50]; 

       Scanner fileScan = new Scanner(new File("phonebook.txt"); 
       fileScan.useDelimiter(","); 

       for(int i = 0; fileScan.hasNext(); i++) 
       { 
        firstName[i] = new firstName[fileScan.next]; 
        lastName[i] = new lastName[fileScan.next]; 
        number[i] = new number[fileScan.next]; 

        System.out.println(firstName[i] +"\t"+ lastName[i] +"\t"+ number[i]); 
       } 

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

John, AppleSeed, 800-555-9000 
    Jack, Torrance, 450-555-3000 
    Elizabeth, MacDonald, 304-555-3042 

Я хочу, чтобы иметь возможность переключить разделитель во время выполнения, чтобы не привести к ошибкам. Однако если я это сделать:

  fileScan.useDelimiter(","); 
     firstName[i] = new firstName[fileScan.next]; 
     lastName[i] = new lastName[fileScan.next]; 
     fileScan.useDelimiter(" "); 
     number[i] = new number[fileScan.next]; 

я все еще получаю errors.The только другая возможность, я мог думать только о том, чтобы просто использовать по умолчанию и попытаться вынуть запятые после. Есть лучший способ сделать это?

+0

Какой тип вы получаете? – BlackVegetable

+0

@BlackVegetable Прямо сейчас у меня нет прямого доступа к компьютеру, чем я могу запустить его, но я считаю, что это было InputMisMatchException. –

ответ

2

Scanner.useDelimiter Метод принимает Pattern или String представление Pattern в качестве аргумента.

Вы пробовали просто использовать fileScan.useDelimiter(",\\s?");?

Это должно разграничить вас на основании ,, за которым следует пробел.

Например:

У вас есть файл с именем foo.txt, содержащий текст в вашем примере, в пути: my/path/foo.txt

Вот код, чтобы разобрать его с Scanner

try { 
    Scanner s = new Scanner(new File("my/path/foo.txt")); 
    s.useDelimiter(",\\s?"); 
    while (s.hasNext()) { 
     System.out.println(s.next()); 
    } 
} 
catch (FileNotFoundException fnfe) { 
    fnfe.printStackTrace(); 
} 

Выход :

John 
AppleSeed 
800-555-9000 
Jack 
Torrance 
450-555-3000 
Elizabeth 
MacDonald 
304-555-3042 
+0

Параметры (", \\ s"); позволит файловому знаку разделить на пробелы после двух запятых? Если так, это именно то, что я искал! –

+0

@FriarBob Я действительно начинаю задаваться вопросом, неправильно ли я понял ваш вопрос. Попробуйте «Образец», который я указал, и скажите, отображает ли он правильный результат. В противном случае отредактируйте свой ответ с помощью точного ввода и вывода. – Mena

+0

Проблема заключается в переходе от последней строки в первой строке к первой строке во второй строке. Поскольку она ограничивает только запятую, число и первое имя помещаются в один и тот же массив, а последний массив в конце файла не обрабатывается. –

2

Вы считаете, что хотите прочитать строку, а затем с помощью string.split вывести Fname и Lname. How to split a string in Java

+0

Это тоже может работать, но немного сложнее, чем я ожидал. –

+0

Код не так уж плохо для этого. Просто прочтите строку, запустите некоторое время, чтобы убедиться, что это не EOF, а затем проанализируйте строку в массивы того, что вам нужно. – DaBaer

+0

hmm Да, я полагаю, я просто надеялся, что будет другой способ, используя только deLimiters. Я не вижу никаких проблем с этим. –

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