解析csv文件(golang)时如何忽略双引号?

问题描述 投票:0回答:1

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、无

csv go parsing double-quotes
1个回答
0
投票

您遇到的困难是因为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 中的所有字段都将被引用,确保输出符合您在原始文件中保留字段周围引号的要求。

© www.soinside.com 2019 - 2024. All rights reserved.