私はGoを学び始めました。ioutil.ReadFile関数を使用すると、EOFが含まれているということに少し戸惑っています。たとえば、ファイルを読み込み、フィールドセパレータ上のすべての行を解析する必要があります。ReadFileまたはReadAllがEOFを読み取らないようにしてください
サンプル入力ファイル:これは私が読んで、そのファイルを解析するために何をすべきかです
CZG;KCZG;some text
EKY;KEKY;some text
A50;KA50;some text
UKY;UCFL;some text
MIC;KMIC;some text
K2M;K23M;some text
:
はimport(
"fmt"
"log"
"io/ioutil"
"strings"
)
func main() {
/* Read file */
airportsFile := "/path/to/file/ad_iata"
content, err := ioutil.ReadFile(airportsFile)
if err != nil {
log.Fatal(err)
}
/* split content on EOL */
lines := strings.Split(string(content), "\n")
/* split line on field separator ; */
for _, line := range lines {
lineSplit := strings.Split(line, ";")
fmt.Println(lineSplit)
}
}
string.Split機能がlineSplitスライスの最後に空の要素を追加したときに、それをEOF(解析するものはありません)が表示されます。したがって、そのスライス(lineSplit[1]
)の2番目のインデックスにアクセスする場合は、panic: runtime error: index out of range
に移動します。私は実行して範囲を制限する必要があり、この
/* split line on field separator ; */
lenLines := len(lines) -1
for _, line := range lines[:lenLines] {
lineSplit := strings.Split(line, ";")
fmt.Println(lineSplit[1])
}
私はその簡潔さのためのReadFileを使用して保存しておきたい場合は、より良い方法はありますか? ioutil.ReadAll
ファイルの末尾に '\ n'がありません。あなたのソリューションは 'bufio.Scanner'でうまく動作しますが、EOFが見えるときにioutil.ReadFileが空のスライスを追加しないようにするオプションがあるかどうかは不思議です。もし存在しなければ、bufioを使用します。ありがとう。 – ripat
改行がないことをどのように確認しましたか?編集者の中には、これらを実際には空白行として表示するのではなく、とにかく静かに追加する編集者もいます。 'od -tc/path/to/file/ad_iata'を試してみてください。 – Thomas
私は訂正しました。最後の行の最後には '\ n'という末尾があります。これにより、 'ioutil.ReadFile'の動作が私にとってより論理的になります。私はあなたから何かを学んだ。再度、感謝します。 – ripat