2014-04-21 7 views
0
처럼 나는 스캐너를 통해 .txt 파일에서 데이터를 액세스하고

는 .txt 파일은 같습니다의 데이터에 액세스 할

Capital 
City 
Farm 

101 9000.00 
102 1000.00 

:이 같은 포맷 할 필요가

001 City  5000.00 101 
002 Capital 4000.00 101 
003 Farm  1000.00 102 

내 코드 소르 멀리 :

try{ 
     Scanner scan = new Scanner(new File("C:\\Users\\Dustin\\Desktop\\test.txt")); 
     String[] strArray = new String[3]; 
     TreeSet<String> ts = new TreeSet<String>(); 
     while(scan.hasNextLine()){ 
      ts.add(scan.nextLine()); 
      //strArray[0] = scan.nextLine(); 
      //StringTokenizer stkn = new StringTokenizer(strArray[0],","); 
      //System.out.println(stkn.nextElement()); 
      //System.out.println(strArray[0]); 
     } 
     for(String s : ts){ 
     System.out.println(s); 
     }catch(Exception e){ 
     System.out.println("Error: "+e.getMessage()); 
} 

하지만이 데이터의 개별 항목에 액세스하는 방법을 알고 세트에 추가 한 다음이 101을 추가하지 마십시오 함께. 나는 이것에 아주 새롭다, 어떤 도움든지 평가 될 것입니다.

+0

어떻게 포맷 하시겠습니까? –

+0

위의 .txt 파일의 데이터가 속성 유형 (도시, 자본 등)으로 다시 포맷 된 다음 속성 ID (101,102)에 의해 순서가 지정되어야하고 동일한 ID 인 경우 합계를 함께 추가하십시오. – hexobolic

+0

먼저 스캔해야합니다. 입력은 스캐너를 사용합니다. 그런 다음 StringTokenizer를 사용하여 선을 토큰으로 토큰 화합니다. 따라서 필드를 범주 별 Arraylist에 추가하십시오. 논리를 추가로 수행 할 수 있습니다. –

답변

1

당신은 시도 할 다음과 같이 수 :

텍스트 파일에서 데이터를 읽고 .split(String regex) 방법을 사용하여 분할 : 당신이 ID에 의해 그룹에 원하기 때문에

try{ 
     Scanner scan = new Scanner(new File("C:\\Users\\Dustin\\Desktop\\test.txt")); 
     TreeSet<String> ts = new TreeSet<String>(); 
     while(scan.hasNextLine()){ 
      String[] strArray = scan.nextLine().split("\\s+"); //the will yield an array having {"001", "City", "5000.00", "101"} 

, 당신이 걸릴 수를 HashMap을보고이 줄을 추가 : 파일에서 데이터를 읽을 때 Map<String, Double> map = new HashMap<String, Double>();

TreeSet<String> ts = new TreeSet<String>(); 
Map<String, Double> map = new HashMap<String, Double>() 

, 당신이 있는지 확인됩니다 당신이 다음 세트 반복해야합니다,

ts.add(strArray[1]); 

을 일단 당신이 준비가 : 당신은 이미 동일한 ID와 값을 읽고 :

if(map.containsKey(strArray[3])) 
{ 
    map.put(strArray[3], map.get(strArray[3]) + Double.parseDouble(strArray[2].trim())); 
} 
else 
{ 
    map.put(strArray[3], Double.parseDouble(strArray[2].trim()); 
} 

그리고 당신의 세트에 데이터를 추가 그 내용을 인쇄하십시오. 이렇게하면지도를 반복하고 키 - 값 쌍을 인쇄해야합니다.

도 데이터 구조 순서를 충족시켜 이후, 난 당신이 명확성을 위해 당신의 트리 세트에 넣어 값의 ID의 포함하는 것이 좋습니다 것입니다 있음을 의미하며, : 귀하의 경우를 들어

ts.add(strArray[1] + "(" + strArray[4] + ")"); 
+0

대단히 감사합니다! while 루프에서 나는 무슨 일이 일어나고있는가? 그리고 어떤 범위가 추가되고 있습니까? 임 컴파일 오류가 발생하면 "3"오류가 발생합니다. – hexobolic

+0

.txt doc의 공간 문제로 인해 수정되었습니다. 반복자를 만들거나 반복문을 만들면 어떻게 되나요? 지도 키 값 쌍은 어떻게 반복됩니까? 도와 줘서 고마워. – hexobolic

+0

@ user2723341 :'if else'는'while' 루프에 있어야합니다. 세트를 반복하려면 (내 대답의 마지막 섹션을 참조하는 것으로 가정 함) 질문의 끝에서 이미 수행중인 행을 따라 뭔가를해야합니다. – npinti

0

을 먼저 읽어 각 파일의 라인, 다음 (나는 데 MyRecord이라고도 함)가 객체로 건네 : 그 후

Scanner scan = new Scanner(new File("C:\\test.txt")); 
       TreeSet<String> ts = new TreeSet<String>(); 
       while(scan.hasNextLine()){ 
        ts.add(scan.nextLine()); 
       } 
       ArrayList<MyRecord> records = new ArrayList<MyRecord>(); 
       for(String s : ts){ 
        System.out.println(s); 
        StringTokenizer st = new StringTokenizer(s," "); 
         MyRecord record = new MyRecord(); 
         record.setOrder(st.nextElement().toString());//001 
         record.setName(st.nextElement().toString());//City 
         record.setNumber(st.nextElement().toString());//5000.00 
         record.setGroup(st.nextElement().toString());//101 
         System.out.println(record.toString()); 
         records.add(record); 
       } 

을, 당신이 많은 데 MyRecord와 ArrayList에있는 각 데 MyRecord이 ArrayList의에서 파일
루프의 행이다, 너는 ab 귀하의 요구 사항을 수행 할 수 있습니다.
나머지는 스스로하십시오. 문제 -> 의견 < - 지원하겠습니다.

class MyRecord{ 
    String order, name, group, number; 
    //when calculate number, you need to convert number to number type such as long, double, etc 
    public String getOrder() { 
     return order; 
    } 
    public void setOrder(String order) { 
     this.order = order; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getGroup() { 
     return group; 
    } 
    public void setGroup(String group) { 
     this.group = group; 
    } 
    public String getNumber() { 
     return number; 
    } 
    public void setNumber(String number) { 
     this.number = number; 
    } 
    @Override 
    public String toString() { 
     // TODO Auto-generated method stub 
     return "order: " + order + "| name:" + name + "| number:" + number +"| group" + group; 
    } 

} 
+0

다 도와 주셔서 감사합니다.이 방법을 살펴 보겠습니다. 모든 일에 정말 감사드립니다. – hexobolic

관련 문제