2018年8月29日水曜日

開発環境

Head First C ―頭とからだで覚えるCの基本 (David Griffiths (著)、Dawn Griffiths (著)、中田 秀基 (監修)、木下 哲也 (翻訳)、オライリージャパン)の3章(小さなツールの作成 - 1つのことだけをうまくやる)、自分で考えてみよう(p. 139)をGoで取り組んでみる。

自分で考えてみよう(p. 139)

コード(Emacs)

package main

import (
 "fmt"
 "os"
 "strings"
)

func main() {
 in, err := os.Open("spooky.csv")
 if err != nil {
  fmt.Println(err)
  return
 }
 defer in.Close()
 file1, err1 := os.Create("ufos.csv")
 if err1 != nil {
  fmt.Println(err1)
  return
 }
 defer file1.Close()
 file2, err2 := os.Create("disappearances.csv")
 if err2 != nil {
  fmt.Println(err2)
  return
 }
 defer file2.Close()
 file3, err3 := os.Create("others.csv")
 if err3 != nil {
  fmt.Println(err3)
  return
 }
 defer file3.Close()
 var line string
 for {
  n, _ := fmt.Fscanln(in, &line)
  if n != 1 {
   break
  }
  if strings.Contains(line, "UFO") {
   fmt.Fprintln(file1, line)
  } else if strings.Contains(line, "Disappearance") {
   fmt.Fprintln(file2, line)
  } else {
   fmt.Fprintln(file3, line)
  }

 }
}

入出力結果(Terminal)

$ go run sample4.go
$ cat spooky.csv 
30.685163,-68.137207,Type=Yeti
-100.0, 50,Type=Test1
28.304380,-74.575195,Type=UFO
29.132971,-71.136475,Type=Ship
28.343065,-62.753906,Type=Elvis
27.868217,-68.005371,Type=Goatsucker
30.496017,-73.333740,Type=Disappearance
26.224447,-71.477051,Type=UFO
29.401320,-66.027832,Type=Ship
37.879536,-69.477539,Type=Elvis
22.705256,-68.192139,Type=Elvis
27.166695,-87.484131,Type=Elvis
50,200,Type=Test2
$ cat ufos.csv 
28.304380,-74.575195,Type=UFO
26.224447,-71.477051,Type=UFO
$ cat others.csv 
30.685163,-68.137207,Type=Yeti
-100.0,
0,Type=Test1
29.132971,-71.136475,Type=Ship
28.343065,-62.753906,Type=Elvis
27.868217,-68.005371,Type=Goatsucker
29.401320,-66.027832,Type=Ship
37.879536,-69.477539,Type=Elvis
22.705256,-68.192139,Type=Elvis
27.166695,-87.484131,Type=Elvis
50,200,Type=Test2
$ 

fmt パッケージの Fscanln関数で、一部が行ごとに上手く読み込まれてない理由、原因はわからず。(-100.0, 50, Type=Test1、出力はothers.csvファイル。行が分割されてるし、50が0になってる。この行のみカンマの次にスペースが含まれているのが、何か影響してるのか。。)

0 コメント:

コメントを投稿