Skip to content

Instantly share code, notes, and snippets.

@c-yan
Last active February 27, 2018 13:47
Show Gist options
  • Save c-yan/da8abffc6c5c0dc6ff3bae97d768b489 to your computer and use it in GitHub Desktop.
Save c-yan/da8abffc6c5c0dc6ff3bae97d768b489 to your computer and use it in GitHub Desktop.
13. col1.txtとcol2.txtをマージ 12で作ったcol1.txtとcol2.txtを結合し,元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ.確認にはpasteコマンドを用いよ.
package mr
import (
"bufio"
"io"
"os"
"strings"
)
type multiReader struct {
Readers []*bufio.Reader
Tmp []string
}
func NewMultiReader(fpList ...*os.File) *multiReader {
readers := make([]*bufio.Reader, len(fpList))
for i, fp := range fpList {
readers[i] = bufio.NewReader(fp)
}
return &multiReader{readers, make([]string, len(readers))}
}
func (mr *multiReader) ReadLine() (string, error) {
var gerr error = nil
for i, r := range mr.Readers {
s, err := r.ReadString('\n')
if ((err != nil) && (err != io.EOF)) || ((err == io.EOF) && (s == "")) {
return "", err
}
mr.Tmp[i] = strings.TrimRight(s, "\r\n")
if err == io.EOF {
gerr = io.EOF
}
}
return strings.Join(mr.Tmp, "\t"), gerr
}
package main
import (
"./mr"
"fmt"
"io"
"os"
)
func main() {
fileList := os.Args[1:]
fpList := make([]*os.File, len(fileList))
for i, fn := range fileList {
fp, err := os.Open(fn)
if err != nil {
panic(err)
}
fpList[i] = fp
defer fp.Close()
}
mreader := mr.NewMultiReader(fpList...)
for {
line, err := mreader.ReadLine()
if (err != nil) && (err != io.EOF) {
panic(err)
}
if line != "" {
fmt.Println(line)
}
if err == io.EOF {
break
}
}
}
@c-yan
Copy link
Author

c-yan commented Feb 21, 2018

execution result

>paste col1.txt col2.txt
高知県  江川崎
埼玉県  熊谷
岐阜県  多治見
山形県  山形
山梨県  甲府
和歌山県        かつらぎ
静岡県  天竜
山梨県  勝沼
埼玉県  越谷
群馬県  館林
群馬県  上里見
愛知県  愛西
千葉県  牛久
静岡県  佐久間
愛媛県  宇和島
山形県  酒田
岐阜県  美濃
群馬県  前橋
千葉県  茂原
埼玉県  鳩山
大阪府  豊中
山梨県  大月
山形県  鶴岡
愛知県  名古屋

>paste col1.txt col2.txt col3.txt
高知県  江川崎  41
埼玉県  熊谷    40.9
岐阜県  多治見  40.9
山形県  山形    40.8
山梨県  甲府    40.7
和歌山県        かつらぎ        40.6
静岡県  天竜    40.6
山梨県  勝沼    40.5
埼玉県  越谷    40.4
群馬県  館林    40.3
群馬県  上里見  40.3
愛知県  愛西    40.3
千葉県  牛久    40.2
静岡県  佐久間  40.2
愛媛県  宇和島  40.2
山形県  酒田    40.1
岐阜県  美濃    40
群馬県  前橋    40
千葉県  茂原    39.9
埼玉県  鳩山    39.9
大阪府  豊中    39.9
山梨県  大月    39.9
山形県  鶴岡    39.9
愛知県  名古屋  39.9

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment