2014-11-30 2 views
1

Итак, для начала я попытаюсь объяснить, что я пытаюсь выполнить. Я новичок в java, и я готов это изучить. Проблема:Java, чтение чисел из txt-файлов со специальными символами в двумерный массив целых чисел

Давайте предположим, что у меня есть текстовый файл, заполненный чем-то вроде этого:

Узор: | a b |, когда a - это идентификатор, а b - действительное число. Я прочитал о классах Scanner, FileReader и BufferedReader в java, я попытался использовать их для восстановления целых чисел из файла и сохранения их в моем двухмерном массиве целых чисел ([2] [1000]). [0] [0-999] будет ID, а 1 [0-999] будут действительными числами. Теперь вот в этот момент я застрял - я могу прочитать первые два нуля, но тогда я не знаю, как пропустить | символ.

Мой код прямо сейчас:

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 


public class ShortSearching { 
    public static void main(String[] args) { 

     int[] tall = new int[100]; 
     int i = 0, k = 0; 
     Tab tablica = new Tab(); 
     File textFile = new File("byteObs.txt"); 
     try (Scanner scanner = new Scanner(textFile)) { 
      while (scanner.hasNextInt()) { 
       k++; 
       tall[i++] = scanner.nextInt(); 
       System.out.println(tall[i]); 
       if (k == 2) { 
        scanner.findInLine("|"); 
        scanner.skip("|"); 
        k = 0; 
       } 
      } 

     } catch (FileNotFoundException e) { 
      System.out.println("File not found: " + textFile.toString()); 
      //e.printStackTrace(); 
     } 



     /*String byteObs = "byteObs.txt"; 
     File textFile = new File(byteObs); 
     Scanner input = new Scanner(textFile); 
     //short[] tabID,tabVal = new short[1000]; 
     byte k = 0; 

     while (input.hasNextLine()) { 


      for (int i = 0; i <= 999; i++) { 
       for (int j = 0; j <= 999; j++) { 
        if (k != 2) { 
         if (input.hasNextShort()) { 
          //matrix[i][j] = input.nextShort(); 
          //System.out.printf("%d ", matrix[i][j]); 
          k++; 
         } 
        } 
        else { 
         input.skip("|"); 
         k=0; 
        } 
       } 
      } 


     } 
     input.close(); */ 
    }} 

Я пробовал несколько способов, не может вставить некоторые из них, потому что они уже удалены. Я был бы признателен, если бы кто-нибудь хотя бы указал мне на метод, который я должен прочитать, чтобы пропустить это | символ в текстовом файле.

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

EDIT http://wklej.org/id/1543739/

Heres полный текст.

+1

Может ли вы [редактировать] Ваш вопрос и вместо поста изображений фактических текстовые данные, хранящиеся в файле, чтобы мы могли использовать его при создании решения вашей проблемы? – Pshemo

+0

Отредактировано уже. – Setzo

ответ

2

Сканер во многих своих методах ожидает шаблон, представляющий регулярные выражения (регулярное выражение). Это также происходит в случае метода skip, но в regex | является метасимволом, представляющим оператор OR. Чтобы сделать это простым литералом, вам нужно сбежать от него, добавив \ (помните, что для создания литерала в String вам также необходимо избежать его с помощью другого \).

Таким образом, регулярное выражение, представляющее |, имеет значение \|, которое должно быть написано как строка "\\|".

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

1 | 

, когда мы будем вызовите nextInt() курсор будет установлен сразу после 1 (я отметит его с I)

1I | 

так шаблон, который мы хотим, чтобы пропустить это space + |.

Последняя проблема в том, что ваш файл не имеет правильные значения во всех линиях (она имеет строки, содержащие только
| | где мы не будем иметь возможность использовать nextInt(), потому что следующий элемент не будет инт. В этом случае мы может просто проверить, начинается ли эта строка с целого числа с помощью hasNextInt(), и если он не читает, потребляйте его без обработки его содержимого, вызывая nextLine().

Так что ваш код может выглядеть

File textFile = new File("input.txt"); 
try (Scanner sc = new Scanner(textFile)) { 
    while (sc.hasNextLine()) { 
     if (sc.hasNextInt()) { 
      System.out.println("id = " + sc.nextInt()); 
      System.out.println("value = " + sc.nextInt()); 
      if (sc.hasNext("\\|")) 
       sc.skip(" \\|"); 
     } else { 
      sc.nextLine(); // skip line if it doens't contain more integers 
     } 
    } 
} catch (FileNotFoundException e) { 
    System.out.println("File not found: " + textFile); 
} 
+0

Работы, большое спасибо: D Люблю тебя. – Setzo

+0

Добро пожаловать :). В любом случае, поскольку вы новичок в Stack Overflow, вы, вероятно, должны прочитать [принятие механизма ответа] (http://meta.stackexchange.com/a/5235/186652). – Pshemo

+0

Ну, спасибо: D Принял ответ, как только увидел это, извините за задержку. – Setzo