2016-07-31 34 views
0

私はこれをしたい: Golangのテキストファイルから読み込みますか?

  1. は、テキストファイルから行を読み込みます。
  2. 行を処理します。
  3. 行を削除します。

私が最初に考えたのは、ioutil.Readfile()
をメモリにファイル全体を読み込むことだったが、私は、
行が処理された後にテキストファイルを更新するかどうかはわかりませんし、余分な行がある場合に何が起こりますメモリに読み込まれた後にテキストファイルに追加されますか?

私は通常、シェルスクリプトを書いて、このようなものだろう:

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

Golangでこれを行うための最善の方法は何を?

+4

ファイル全体を書き換えずに、ファイルの先頭から行を削除することはできません。あなたの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-準備完了データベースを使用してください。
が 、4-、ファイル内で使用仮想ファイルシステムを、1つのファイルのように各行を扱い、以下を参照してください。https://github.com/lotrfan/vfshttps://github.com/blang/vfs(データベースサーバなど)のファイルマネージャを使用して

は、ファイルロックのジレンマを解決します。

ファイルを使用する目的が、送信者プログラムが新しい行と受信者プログラムを追加する単方向通信であれば、os pipes(名前付きパイプ(FIFO))またはその他のinteropメソッドを使用する方が良いです。

Linux用参照:Windows用Unix FIFO in go?
:​​

サンプルファイルライター:

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) 
    } 
} 
関連する問題