2013-06-15 3 views
1

나는 읽을 텍스트 데이터가 들어있는 텍스트 파일을 가지고 있습니다. 불행히도 그 방법을 찾을 수 없습니다.Go를 사용하여 텍스트 파일에서 데이터 읽기

여기

5 4 
1 2 - Yogurt 
2 0 X Chicken soup 
3 1 X Cheese 
4 3 X Ham 
2 
3 
4 
0 

파일은 세 부분으로 이루어지는 예이다. 첫 번째 부분은 헤더 (첫 번째 줄)이고, 두 번째 부분은 레코드 목록이며, 마지막 부분은 unit64 값의 목록입니다.

헤더에는 uint64 다음에 unit16이라는 두 개의 값만 포함됩니다. 두 번째 값은 레코드 수와 세 번째 파트의 값 수입니다.이 수는 동일하므로이 값을 사용하십시오.

레코드는 unit64 값 다음에 uint16 값이오고, 그 뒤에는 X 또는 - 만 가능한 단일 문자와 줄 끝까지 utf-8로 인코딩 된 문자열이옵니다. 데이터는 fmt.Fprintf()를 사용하여 파일에 기록됩니다.

세 번째 부분은 uint64 값을 포함합니다.

나는이 데이터를 텍스트 파일에서 읽는 방법을 찾으려고 노력하고 있으며 길을 찾을 수 없습니다.

str에 숫자에 속한 숫자 만 들어있는 경우 strconv.ParseUint (str, 0, 64) 또는 uint16 (strconv.ParseUint (str, 0, 16)) 만 사용할 수 있습니다. 리더를 사용하기 위해 bufio를 살펴 봤지만 대부분의 줄을 얻을 수 있습니다. 아마도 bufio.Scanner를 사용해야하지만 문서에서 사용하는 방법을 결정할 수는 없습니다.

+0

어쩌면 http://stackoverflow.com/questions/5884154/golang-read-text-file-into-string-array-and-write 도움이 될 수 있습니다. –

+0

찾았지만 도움이되지 않습니다. 나는 fmt.Scanf (...)를 사용하여 끝내었다. ReadString ('\ n')은 앞뒤에 공백이 있고 끝에는 \ n 문자열을 반환하기 때문에 문자열의 끝을 읽으려면 문자열을 다듬어야했습니다. – chmike

답변

4

Rubber duck debugging 효과가 다시 적용되었습니다. 질문을 한 후에, 나는 내 자신의 대답을 발견했다. 여기에 다른 사람들이 내가 가진 것과 같은 문제를 공유하는 경우입니다. 단순히 데이터를 출력 할 수 있습니다 다음과 같은 예에서

import (
    "bufio" 
    "fmt" 
    "log" 
    "os" 
    "strings" 
) 


func loadFile(fileName string) { 
    // Open file and instantiate a reader 
    file, err := os.Open(fileName) 
    if err != nil { 
     log.Fatal(err) 
    } 
    reader := bufio.NewReader(file) 

    var { 
     value0 uint64, 
     nbrRows uint16 
    } 

    // Read header values 
    if _,err := fmt.Fscanf(reader, "%d %d\n", &value0, &nbrRows); err != nil { 
     log.Fatal(err) 
    } 

    // Iterate on the rows 
    for i := uint16(0); i < nbrRows; i++ { 
     var { 
      value1 uint64, 
      value2 uint16, 
      value3 string, 
      value4 string 
     } 

     // Read first three row values 
     if _,err := fmt.Fscanf(reader, "%d %d %s\n", &value1, &value2, &value3); err != nil { 
      log.Fatal(err) 
     } 
     // Read remain of line 
     if value4,err := reader.ReadString('\n'); err != nil { 
      log.Fatal(err) 
     } 
     value4 = strings.Trim(value4," \n") 

     // Display the parsed data 
     fmt.Printf("%d %d %s '%s'\n", value1, value2, value3, value4) 
    } 

    // Iterate on the rows containing a single integer value 
    for i := uint16(0); i < nbrRows; i++ { 
     var value5 uint64 

     // Read the value 
     if _,err := fmt.Fscanf(reader, "%d\n", &value5); err != nil { 
      log.Fatal(err) 
     } 

     // Display the parsed data 
     fmt.Printf("%d\n", value5) 
    } 
} 

이 코드

는 VALUE4 시작하고 내 경우, 이는 공백이나 줄 바꿈으로 끝나지 않는 가정 읽어 보시기 바랍니다. 이것은 Trim() 호출로 제거되기 때문입니다.

+0

나는 그 기술을 좋아하지 만, 불행하게도 나는 당시에 가장 가까운 누구든지 내 지정된 오리처럼 사용하는 경향이있다. 그들은 대개 혼란 스럽지만 때로는 놀라운 조언을 제공합니다! – Intermernet

관련 문제