2012-08-28 5 views
0

레코드 저장소 장바구니를 시뮬레이트하는 Java 프로그램을 작성하려고합니다. 첫 번째 단계는 inventory.txt 파일을 열고 기본적으로 "스토어가 제공하는 내용"인 내용을 읽는 것입니다. ". 그런 다음 모든 라인을 개별적으로 읽고 ID 레코드와 가격을 처리해야합니다.쉼표로 구분 된 텍스트 파일에서 읽기

현재 방법은 필자가 필요로하는 것과 매우 가까운 결과를 출력하지만 아래에서 볼 수 있듯이 다음 줄의 항목 ID를 선택합니다.

누군가가 텍스트 문서의 모든 라인을 개별적으로 처리하고 데이터의 모든 부분을 다음 항목의 id을 집어 들지 않고 자체 변수에 저장하는 방법을 알아낼 수 있는지 궁금합니다.

public void openFile(){ 
    try{ 
     x = new Scanner(new File("inventory.txt")); 
     x.useDelimiter(","); 
    } 
    catch(Exception e){ 
     System.out.println("Could not find file"); 
    } 
} 

public void readFile(){ 
    while(x.hasNext()){ 
     String id = x.next(); 
     String record = x.next(); 
     String price = x.next();    
     System.out.println(id + " " + record + " " + price); 
     break; 
    } 
} 

이 .txt 문헌 :

11111, "Hush Hush... - Pussycat Dolls", 12.95 
22222, "Animal - Ke$ha", 9.95 
33333, "Hanging By A Moment - Lifehouse - Single, 4.95 
44444, "Have A Nice Day - Bon Jovi", 9.99 
55555, "Day & Age - Killers", 10.99 
66666, "She Wolf - Shakira", 15.99 
77777, "Dark Horse - Nickelback", 12.99 
88888, "The E.N.D. - Black Eyed Peas", 10.95 

실제 출력

11111 "Hush Hush... - Pussycat Dolls" 12.95 
22222 

예상 결과

11111 "Hush Hush... - Pussycat Dolls" 12.95 

답변

1

Scanner.useDelimiter의 인수로 Pattern을 사용할 수 있습니다. 이 옵션을 사용하여 구분 기호를 쉼표 또는 줄 구분 기호로 지정할 수 있습니다.

입력 파일이 줄 구분 기호로 사용하는 내용에 따라 두 번째 옵션을 변경해야 할 수 있습니다.

기존 CSV 라이브러리 사용에 대한 다른 답변은 좋습니다. CSV 을 구문 분석하는 것은 쉼표로 입력을 깨는 것처럼 간단하지 않습니다..

4

여기서 특히 문제는 쉼표로 구분된다는 점입니다. 쉼표와 개행을 깨뜨려 야합니다. 그러나 다른 코너 사례가 수없이 많습니다 (예 : 칼럼이 "abc ,,, abc"인 경우 쉼표로 구분해서는 안됩니다). 아파치 코 몬즈이 코너의 모든 경우를 처리하는 CSVParser 함께 제공, 당신은 그것을 사용해야합니다

http://commons.apache.org/csv/apidocs/org/apache/commons/csv/CSVParser.html

+0

많은 Csv 라이브러리가 있습니다. Sourceforge에는 "Java CSV Library", openCsv, JRecord, flatpac 등이 있습니다. https://sourceforge.net/projects/javacsv/?source=directory 또는 https://sourceforge.net/projects/opencsv/?source=를 참조하십시오. 예배 규칙서 –

0

하지만 자신 만의 방법을가는, 먼저 줄을 읽을 스캐너를 사용할 수 이것을 달성하기 위해 여러 가지 방법이 있습니다 (Java의 "line.separator"를 구분 기호로 사용). 그런 다음 구분자로 쉼표로 Scanner 클래스를 다시 사용하십시오.

0

문제는 CSV가 단지 String을 쉼표로 구분하는 것입니다. "이스케이프 처리 된"쉼표 (쉼표로 구분하지 않으려는 쉼표)를 고려해야합니다.

많은 시간을 절약하고 아픔을 피하고 기존 API를 사용하는 것이 좋습니다.

Apache Commons는 이미 언급되었습니다.나는 최근에 ... OpenCSV을 사용하고 사용하기 매우 간단하고 강력한

이럴

0

문자열 목록 (선)에 전체 파일을 읽을 수있는 쉬운 방법을 발견

public class Scanner { 
public static List<String> readLines(String filename) throws IOException { 
    FileReader fileReader = new FileReader(filename); 
    BufferedReader bufferedReader = new BufferedReader(fileReader); 
    List<String> lines = new ArrayList<String>(); 
    String line = null; 
    while ((line = bufferedReader.readLine()) != null) { 
     lines.add(line); 
    } 
    bufferedReader.close(); 
    return lines; 
    } 
} 

그런 다음 각 행은 자체 String 객체이므로 이전과 같이 개별 행을 처리 할 수 ​​있습니다. 즉, CSVParser를 사용하지 않는 경우입니다.