2012-03-11 4 views
0

나는 이것을 두어 시간 동안 알아 내려고 노력했다. 나는 당신 중 한 명이 나를 도울 수 있기를 희망한다. 파일 사이에 숫자와 공백이있는 행과 열이있는 파일 (실제로는 두 개이지만 중요하지 않음)이 있습니다. 그리고 BufferedReader를 사용하여 읽으려고합니다. 그리고 그것은 훌륭하게 작동합니다. 그러나 나는 원하는 문자열 인 &을 인쇄 할 수 있습니다. 나는 다음과 같은 오류가 그 문자열과 문자를 구문 분석하려고 할 때 : 나는 구글이 발견 한 내가 생각파일에서 문자열을 int로 구문 분석하려고합니다. NumberFormatException 가져 오기 : 입력 문자열 : "", 문자열 문자열 좋은 int 문자열이 나타납니다. Java

Exception in thread "main" java.lang.NumberFormatException: For input string: "" 
at java.lang.NumberFormatException.forInputString(Unknown Source) 
at java.lang.Integer.parseInt(Unknown Source) 
at java.lang.Integer.parseInt(Unknown Source) 
at FileProcess.processed(FileProcess.java:30) 
at DecisionTree.main(DecisionTree.java:16) 

에서 오류가 내 파일을 읽는 방법에 있습니다.

public class ReadFiles { 
private BufferedReader read; 
public ReadFiles(BufferedReader startRead) { 
    read = startRead; 
} 

public String readFiles() throws IOException { 
    try { 
     String readLine = read.readLine().trim(); 
     String readStuff = ""; 
     while(readLine != null) { 
      readStuff += (readLine + "\n"); 
      readLine = read.readLine(); 
     } 
      return readStuff; 
    } 
    catch(NumberFormatException e) { 
     return null; 
    } 
} 

그리고 구문 분석

이 내가 출력 할 계획 무엇을위한 실제 코드가 아니라 오류가 주석 코드에 나타납니다

public class FileProcess { 

public String processed() throws IOException { 
fileSelect fs = new fileSelect(); 
ReadFiles tr = new ReadFiles(fs.traning()); 
String training = tr.readFiles(); 

ReadFiles ts = new ReadFiles(fs.test()); 
String test = ts.readFiles(); 
List liste = new List(14,test.length()); 

String[] test2 = test.split("\n"); 

for(int i = 0; i<test2[0].length(); i++) {  
    char tmp = test.charAt(i); 
    String S = Character.toString(tmp).trim(); 

    //int i1 = Integer.parseInt(S); 

    System.out.print(S);   
} 

비트. 따라서 문자열 출력은 다음과 같습니다.

12112211 

정수로 구문 분석하는 것이 좋습니다. 그러나 그것은 효과가 없습니다. 나는 수동으로 0과 1의 char 위치에있는 것을 보려고 노력했다. 0의 경우 1을 얻었지만 1의 경우에는 아무것도 얻지 못했다. "". 그렇다면 ""을 어떻게 제거 할 수 있습니까? 나는 너희들이 나를 도울 수 있고, 더 많은 정보가 필요하면 알려주 길 바래. 그러나 나는 필요한 것을 다 다루었다고 생각합니다. 사전 :

그래, 그리고 또 하나의

감사 : 나는 "0"""를 교체 할 경우 작동,하지만 내가 제거하는 영리한 방법을 찾을 수없는 모든 0을 얻는다. 그러나 구문 분석이나 무언가를하면서 건너 뛰는 것이 가능합니까? 내 파일은 1과 2 만 보유하고 있기 때문에 가능한 경우 아무 것도 방해하지 않습니다.

+0

:

sc = new java.util.Scanner (line); sc.nextInt(); 

또 다른 아이디어는 부분을 라인, 분할 트림 및 구문 분석하는 것입니다 파일의 첫 번째 줄은 그 한 문자로 구성된 문자열을 만든 다음 앞뒤 공백을 제거하여 문자열을 "트림"합니다. 즉,'' "또는'"t "'를' ""), 그 문자열을 정수로 파싱합니다. 따라서 문자열이 비어 있다고 말하는 예외가 발생하는 경우 이는 파일의 첫 번째 줄 어딘가에 공백 문자가 있음을 의미합니다. 해결 방법은 - 파일의 첫 줄에 공백 문자가 없어야합니다. – ruakh

+0

첫 번째 줄의 공백 문자로이 작업을 수행하는 것이 불가능할 것이라고 말하는 것입니까? 왜냐하면 내가 얻은 파일은 숙제 때문이며 내가 편집 할 수 있다고 생각하지 않는다./ – dtd

+0

첫 줄에 공백이 있으면 * 현재 코드 *가 작동하지 않는다고 말하고있다. (해결책이 파일의 첫 줄에 공백 문자가없는 것이 아니라고 말했을 때 나는 심각하지 않았습니다. 실제로, 왜 프로그램이 실패하는지 이유를 이해해야합니다. 내 설명을 이해하고 - 둘째, 지원해야 할 데이터를 지원하도록 프로그램을 변경하십시오.) – ruakh

답변

0

두 개의 분할 문자가 서로 나란히 있거나 (즉, \ n \ n) 또는 trim() 호출에 공백 문자가 전달되면 빈 문자열을 무시하고 " 계속해라.

+0

당신이 잘못 읽고 있다고 생각합니다. 'parseInt'는'split'이 리턴하는 배열의 첫번째 요소의 단일 문자 부분 문자열에서만 호출됩니다; 그래서'split'의 반환 값에 빈 문자열이 들어 있으면 문제가되지 않습니다. (또는 적어도 그 문제는 * 문제 일 수 있습니다.) – ruakh

+0

하지만 trim()은 공백이나 탭 또는 \ r을 빈 문자열로 다시 변경합니다. –

+0

예, 저는 알고 있습니다. 그러나 그것은 당신의 대답에 관한 것이 아닙니다. 그리고 당신의 대답은 여전히 ​​그 가능성과 함께 불가능을 언급합니다. – ruakh

0

당신은 공백을 건너 뜁니다의 int에 대한 구문 분석 스캐너 클래스를 사용할 수 있습니다 : 각 문자에 들어

lin = line.trim(); 
String [] words = lin.split (" +"); 
for (String si : words) 
    Integer.parseInt (si);