以下是读取文件名为C:\Users\You\Downloads\一致性核查清单详单导出 - 2023-05-17T103201.607.csv、一致性核查清单详单导出 - 2023-05-17T103149.925.csv的GBK编码格式的csv文件,并处理表头的代码:
package main
import (
"encoding/csv"
"fmt"
"os"
)
func main() {
// 打开文件
f1, err := os.Open("C:\\Users\\You\\Downloads\\一致性核查清单详单导出 - 2023-05-17T103201.607.csv")
if err != nil {
panic(err)
}
defer f1.Close()
f2, err := os.Open("C:\\Users\\You\\Downloads\\一致性核查清单详单导出 - 2023-05-17T103149.925.csv")
if err != nil {
panic(err)
}
defer f2.Close()
// 解析CSV文件
r1 := csv.NewReader(f1)
r1.LazyQuotes = true
r1.TrimLeadingSpace = true
r1.FieldsPerRecord = -1
r2 := csv.NewReader(f2)
r2.LazyQuotes = true
r2.TrimLeadingSpace = true
r2.FieldsPerRecord = -1
records1, err := r1.ReadAll()
if err != nil {
panic(err)
}
records2, err := r2.ReadAll()
if err != nil {
panic(err)
}
// 处理第一个文件
if len(records1[0]) == 18 {
// 直接另存为temp.csv
f, err := os.Create("temp.csv")
if err != nil {
panic(err)
}
defer f.Close()
w := csv.NewWriter(f)
err = w.WriteAll(records1)
if err != nil {
panic(err)
}
} else if len(records1[0]) == 17 {
// 在第6列插入“网络制式的”列,然后追加到temp.csv
records1[0] = append(records1[0][:5], append([]string{"网络制式的"}, records1[0][5:]...)...)
for i := range records1[1:] {
records1[i+1] = append(records1[i+1][:5], append([]string{""}, records1[i+1][5:]...)...)
}
f, err := os.Create("temp.csv")
if err != nil {
panic(err)
}
defer f.Close()
w := csv.NewWriter(f)
err = w.WriteAll(records1)
if err != nil {
panic(err)
}
}
// 处理第二个文件
if len(records2[0]) == 18 {
f, err := os.OpenFile("temp.csv", os.O_APPEND|os.O_WRONLY, os.ModeAppend)
if err != nil {
panic(err)
}
defer f.Close()
w := csv.NewWriter(f)
err = w.WriteAll(records2)
if err != nil {
panic(err)
}
} else if len(records2[0]) == 17 {
records2[0] = append(records2[0][:5], append([]string{"网络制式的"}, records2[0][5:]...)...)
for i := range records2[1:] {
records2[i+1] = append(records2[i+1][:5], append([]string{""}, records2[i+1][5:]...)...)
}
f, err := os.OpenFile("temp.csv", os.O_APPEND|os.O_WRONLY, os.ModeAppend)
if err != nil {
panic(err)
}
defer f.Close()
w := csv.NewWriter(f)
err = w.WriteAll(records2)
if err != nil {
panic(err)
}
}
fmt.Println("Done")
}
代码中使用了csv
包来解析和处理CSV文件,首先打开并读取两个CSV文件,然后根据表头长度的不同进行不同的处理:
如果表头长度为18,则直接另存为temp.csv
;
如果表头长度为17,则在第6列插入“网络制式的”列,然后追加到temp.csv
。
最后输出“Done”表示处理完成。