2016-07-31 2 views
0

나는이 작업을 수행 할 수 : 골란에있는 텍스트 파일을 읽으시겠습니까?

  1. 텍스트 파일에서 한 줄을 읽어보십시오.
  2. 라인을 처리하십시오.
  3. 줄을 삭제하십시오.

내 첫번째 생각은 ioutil.Readfile()
을 메모리에 전체 파일을 읽을했지만, 난,
라인이 처리 된 후 텍스트 파일을 업데이트하는 방법을 잘 모르겠어요 및 추가 라인 인 경우 어떤 일이 발생 메모리에 읽어 들인 후 텍스트 파일에 추가됩니까?

나는 일반적으로 쉘 스크립트를 작성하고 같은 것을 할 것 :

while read -r line; do 
    echo "${line}" 
    sed -i 1d "${myList}" 
done < "${myList}" 

Golang에서이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

+4

전체 파일을 다시 쓰지 않고도 파일 앞에서 한 줄을 삭제할 수 없습니다. 당신의 sed 예제는 그것의 일을하는 동안 추가 된 줄을 잃는 것과 같은 문제를 가지고 있습니다. 경주는 이전 줄을 처리하는 동안 쓰여졌을 때 줄을 잃어 버렸기 때문에 sed가 작습니다. –

+1

실패로부터 보호하기 위해 줄을 지우는 목적은 무엇입니까? 이 경우 최신 라인이 처리 된 상태 파일을 작성하고 시작할 때 확인한 다음 해당 위치에서 처리를 시작하는 것이 좋습니다. EOF를 누르면 파일을 안전하게 삭제할 수 있습니다. – jxstanford

+0

각 줄을 반복하고 "처리 된"줄을 문자열 변수에 연결 한 다음 문자열 변수의 내용을 사용하여 파일을 다시 씁니다. – openwonk

답변

0

사용 bufio 패키지를.

다음은 텍스트 파일을 열고 각각 line을 반복하는 기본 구문입니다.

package main 

import (
    "bufio" 
    "fmt" 
    "os" 
) 

func main() { 
    // Open the file. 
    f, _ := os.Open("C:\\programs\\file.txt") 
    // Create a new Scanner for the file. 
    scanner := bufio.NewScanner(f) 
    // Loop over all lines in the file and print them. 
    for scanner.Scan() { 
     line := scanner.Text() 
     fmt.Println(line) 
    } 
} 
+0

완벽한, 이것이 내가 필요한 것입니다. 'Wget'가 파일에서 URL을 가져 오는 경우 줄을 지우지 않기 때문에 줄을 지우는 요구 사항을 변경합니다. –

+0

좋은 소리입니다. 일단 당신이 파일을 통해 반복을위한 해골을 가지고 있다면, 당신이 원하는대로 할 수 ... 당신이 원한다면 upvote하십시오. – openwonk

0

몇 가지 옵션이 있습니다.
1- 파일을 읽고 처리 한 다음 다시 쓰십시오 (해당 파일을 잠 가야 함).
2 바이너리 파일을 사용하고 텍스트 처리 (행 잠금 포함)를 최적화하기 위해 링크 된 목록과 같은 특수 데이터 구조를 고안 (사용)하십시오.
3- 준비 데이터베이스를 사용.
이 3- 파일 내부에 사용하는 가상 파일 시스템을 하나 개의 파일처럼 각각의 라인을 취급, 참조 : https://github.com/lotrfan/vfshttps://github.com/blang/vfs (데이터베이스 서버와 같은) 파일 관리자를 사용하여

파일 잠금 딜레마를 해결한다.

파일을 사용하는 목적이 송신자 프로그램이 새로운 행을 추가하는 단방향 통신이고 수신자 프로그램이이를 제거하는 경우 os pipes (명명 된 파이프 (FIFO)) 또는 다른 interop 메소드를 사용하는 것이 좋습니다.

Linux 용 참조 : Windows 용 Unix FIFO in go?
: https://github.com/natefinch/npipe

샘플 파일 작가 :

package main 

import (
    "bufio" 
    "fmt" 
    "os" 
    "time" 
) 

func main() { 
    f, err := os.OpenFile("/tmp/file.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) 
    if err != nil { 
     panic(err) 
    } 
    defer f.Close() 
    for i := 0; ; i++ { 
     w := bufio.NewWriter(f) 
     _, err := fmt.Fprintln(w, i) 
     if err != nil { 
      panic(err) 
     } 
     w.Flush() // Flush writes any buffered data to the underlying io.Writer. 
     f.Sync() // commit the current contents of the file to stable storage. 
     fmt.Println("write", i) 
     time.Sleep(500 * time.Millisecond) 
    } 
} 

샘플 파일 리더 :

package main 

import (
    "fmt" 
    "os" 
    "time" 
) 

func main() { 
    f, err := os.OpenFile("/tmp/file.txt", os.O_RDWR, 0666) 
    if err != nil { 
     panic(err) 
    } 
    defer f.Close() 

    i := 0 
    for { 
     n, err := fmt.Fscanln(f, &i) 
     if n == 1 { 
      fmt.Println(i) 
     } 
     if err != nil { 
      fmt.Println(err) 
      return 
     } 
     time.Sleep(500 * time.Millisecond) 
    } 
} 
관련 문제