以下サンプル
tsv2csv.go
//usr/bin/go run $0 $@ ; exit
package main
import (
"bufio"
"encoding/csv"
"fmt"
"os"
"strings"
)
func main() {
// 標準入力からデータを読み込む
scanner := bufio.NewScanner(os.Stdin)
// CSVライターを作成し、標準出力に書き込む
writer := csv.NewWriter(os.Stdout)
defer writer.Flush()
// 標準入力を1行ずつ読み込み
for scanner.Scan() {
// タブ区切りでフィールドを分割
line := scanner.Text()
fields := strings.Split(line, "\t")
// 各フィールドのエスケープシーケンスを処理
for i, field := range fields {
fields[i] = unescape(field)
}
// CSVとして書き込む
if err := writer.Write(fields); err != nil {
fmt.Println("Error writing record to csv:", err)
return
}
}
if err := scanner.Err(); err != nil {
fmt.Println("Error reading input:", err)
}
}
// エスケープシーケンスを処理する関数
func unescape(s string) string {
if !strings.Contains(s, "\\"){
return s
}
var builder strings.Builder
length := len(s)
for i := 0; i < length; i++ {
if s[i] == '\\' && i+1 < length {
switch s[i+1] {
case 'n':
builder.WriteByte('\n')
i++
case 't':
builder.WriteByte('\t')
i++
case '\\':
builder.WriteByte('\\')
i++
default:
builder.WriteByte(s[i])
}
} else {
builder.WriteByte(s[i])
}
}
return builder.String()
}