golang语言解析csv文件出现问题;解析后不会保留双引号。
我有一个用于解析 csv 文件的代码(golang):
package main
import (
"encoding/csv"
"log"
"os"
)
func processCSV(inputFile, outputFile string) {
// open input file
inputFilePtr, err := os.Open(inputFile)
if err != nil {
log.Fatalf("Error open input file: %v", err)
}
defer inputFilePtr.Close()
// Read CSV
csvReader := csv.NewReader(inputFilePtr)
csvReader.Comma = ','
// save (")
csvReader.LazyQuotes = true
records, err := csvReader.ReadAll()
if err != nil {
log.Fatalf("Error read CSV: %v", err)
}
// Обработка данных
for _, record := range records {
for i, value := range record {
if value == "" {
record[i] = "None"
}
}
}
// Open output file
outputFilePtr, err := os.Create(outputFile)
if err != nil {
log.Fatalf("Error create output file: %v", err)
}
defer outputFilePtr.Close()
// Writing processed data to an output file
csvWriter := csv.NewWriter(outputFilePtr)
defer csvWriter.Flush()
for _, record := range records {
if err := csvWriter.Write(record); err != nil {
log.Fatalf("Error writing to output file: %v", err)
}
}
}
func main() {
inputFileName := "input.csv"
outputFileName := "output.csv"
processCSV(inputFileName, outputFileName)
}
输入.csv文件:
one,"two",three,four
1,"2",3,
4,,6,
如何在数据中保存报价。 代码的结果是这样的:
一、二、三、四 1,2,3,无 4、无、6、无
你需要这个:
一、“二”、三、四 1,"2",3,无 4、无、6、无
您遇到的困难是因为Go中的encoding/csv包默认如何处理CSV文件中的速率。当您读取并写入 CSV 文件时,编写器仅在认为必要时添加引号,通常是为了将包含逗号、换行符或引号本身的字段括起来。为了确保输出文档中的字段与输入中一样不断被引用,您需要在 csv.Writer 中设置 UseCRLF 和 QuoteAll 字段。
func processCSV(inputFile, outputFile string) {
// open input file
inputFilePtr, err := os.Open(inputFile)
if err != nil {
log.Fatalf("Error open input file: %v", err)
}
defer inputFilePtr.Close()
// Read CSV
csvReader := csv.NewReader(inputFilePtr)
csvReader.Comma = ','
csvReader.LazyQuotes = true
records, err := csvReader.ReadAll()
if err != nil {
log.Fatalf("Error read CSV: %v", err)
}
// Process data
for _, record := range records {
for i, value := range record {
if value == "" {
record[i] = "None"
}
}
}
// Open output file
outputFilePtr, err := os.Create(outputFile)
if err != nil {
log.Fatalf("Error create output file: %v", err)
}
defer outputFilePtr.Close()
// Writing processed data to an output file
csvWriter := csv.NewWriter(outputFilePtr)
csvWriter.UseCRLF = true // Use \r\n as the line terminator
csvWriter.Comma = ','
csvWriter.QuoteAll = true // Quote all fields
defer csvWriter.Flush()
for _, record := range records {
if err := csvWriter.Write(record); err != nil {
log.Fatalf("Error writing to output file: %v", err)
}
}
}
通过将 QuoteAll 设置为 true,输出 CSV 中的所有字段都将被引用,确保输出符合您在原始文件中保留字段周围引号的要求。