Golang:从一个CSV文件中获取数据并传输到另一个文件。

huangapple go评论91阅读模式
英文:

Golang: fetching data from 1 CSV File to anthoer

问题

我是你的中文翻译助手,以下是你要翻译的内容:

我是Go语言的新手,我正在尝试从一个CSV文件中提取数据,并将其保存到另一个新的CSV文件中,但我只需要旧文件中的前两条记录。

你想知道如何只提取文件的前两条记录?

以下是我目前尝试过的代码(也可以在play.golang.org上查看):

package main

import (
	"encoding/csv"
	"fmt"
	"io"
	"os"
)

func main() {

	//选择要提取的文件.......

	csvfile1, err := os.Open("data/sample.csv")
	if err != nil {
		fmt.Println(err)
		return
	}

	defer csvfile1.Close()

	reader := csv.NewReader(csvfile1)

	for i := 0; i < 3; i++ {
		record, err := reader.Read()
		if err == io.EOF {
			break
		} else if err != nil {
			fmt.Println(err)
			return
		}
		csvfile2, err := os.Create("data/SingleColomReading.csv")
		if err != nil {
			fmt.Println(err)
			return
		}
		defer csvfile2.Close()

		records := []string{
			record,
		}
		writer := csv.NewWriter(csvfile2)
		//fmt.Println(writer)
		for _, single := range records {

			er := writer.Write(single)
			if er != nil {
				fmt.Println("error", er)
				return
			}

			fmt.Println(single)

			writer.Flush()
			//fmt.Println(records)
			//a:=strconv.Itoa(single)
			n, er2 := csvfile2.WriteString(single)
			if er2 != nil {
				fmt.Println(n, er2)
			}

		}
	}
}
英文:

I am new to golang, and I am trying to fetch 1 csv file to another new csv file, but i need only 2 records from the old csv file.

How would you fetch only the first two records of that file?

Here is what I have tried so far (also in the play.golang.org):

package main
import (
&quot;encoding/csv&quot;
&quot;fmt&quot;
&quot;io&quot;
&quot;os&quot;
)
func main() {
//SELECTING THE FILE TO EXTRACT.......
csvfile1, err := os.Open(&quot;data/sample.csv&quot;)
if err != nil {
fmt.Println(err)
return
}
defer csvfile1.Close()
reader := csv.NewReader(csvfile1)
for i := 0; i &lt; 3; i++ {
record, err := reader.Read()
if err == io.EOF {
break
} else if err != nil {
fmt.Println(err)
return
}
csvfile2, err := os.Create(&quot;data/SingleColomReading.csv&quot;)
if err != nil {
fmt.Println(err)
return
}
defer csvfile2.Close()
records := []string{
record,
}
writer := csv.NewWriter(csvfile2)
//fmt.Println(writer)
for _, single := range records {
er := writer.Write(single)
if er != nil {
fmt.Println(&quot;error&quot;, er)
return
}
fmt.Println(single)
writer.Flush()
//fmt.Println(records)
//a:=strconv.Itoa(single)
n, er2 := csvfile2.WriteString(single)
if er2 != nil {
fmt.Println(n, er2)
}
}
}
}

答案1

得分: 4

修复您的程序,

package main

import (
	"encoding/csv"
	"fmt"
	"io"
	"os"
)

func main() {
	csvfile1, err := os.Open("data/sample.csv")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer csvfile1.Close()
	reader := csv.NewReader(csvfile1)
	csvfile2, err := os.Create("data/SingleColomReading.csv")
	if err != nil {
		fmt.Println(err)
		return
	}
	writer := csv.NewWriter(csvfile2)

	for i := 0; i < 2; i++ {
		record, err := reader.Read()
		if err != nil {
			if err == io.EOF {
				break
			}
			fmt.Println(err)
			return
		}
		err = writer.Write(record)
		if err != nil {
			fmt.Println(err)
			return
		}
	}
	writer.Flush()
	err = csvfile2.Close()
	if err != nil {
		fmt.Println(err)
		return
	}
}

然而,由于您只对整个记录(行)进行复制,而不是记录的各个字段,您可以使用 bufio.Scanner,就像 @VonC 建议的那样。例如,

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	csvfile1, err := os.Open("data/sample.csv")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer csvfile1.Close()
	scanner := bufio.NewScanner(csvfile1)
	csvfile2, err := os.Create("data/SingleColomReading.csv")
	if err != nil {
		fmt.Println(err)
		return
	}
	writer := bufio.NewWriter(csvfile2)

	nRecords := 0
	for scanner.Scan() {
		n, err := writer.Write(scanner.Bytes())
		if err != nil {
			fmt.Println(n, err)
			return
		}
		err = writer.WriteByte('\n')
		if err != nil {
			fmt.Println(err)
			return
		}
		if nRecords++; nRecords >= 2 {
			break
		}
	}
	if err := scanner.Err(); err != nil {
		fmt.Println(err)
		return
	}
	err = writer.Flush()
	if err != nil {
		fmt.Println(err)
		return
	}
	err = csvfile2.Close()
	if err != nil {
		fmt.Println(err)
		return
	}
}

希望这可以帮助您修复程序。

英文:

Fixing your program,

package main
import (
&quot;encoding/csv&quot;
&quot;fmt&quot;
&quot;io&quot;
&quot;os&quot;
)
func main() {
csvfile1, err := os.Open(&quot;data/sample.csv&quot;)
if err != nil {
fmt.Println(err)
return
}
defer csvfile1.Close()
reader := csv.NewReader(csvfile1)
csvfile2, err := os.Create(&quot;data/SingleColomReading.csv&quot;)
if err != nil {
fmt.Println(err)
return
}
writer := csv.NewWriter(csvfile2)
for i := 0; i &lt; 2; i++ {
record, err := reader.Read()
if err != nil {
if err == io.EOF {
break
}
fmt.Println(err)
return
}
err = writer.Write(record)
if err != nil {
fmt.Println(err)
return
}
}
writer.Flush()
err = csvfile2.Close()
if err != nil {
fmt.Println(err)
return
}
}

However, since you are only interested in copying records (lines) as a whole and not individual fields of a record, you could use bufio.Scanner, as @VonC suggested. For example,

package main
import (
&quot;bufio&quot;
&quot;fmt&quot;
&quot;os&quot;
)
func main() {
csvfile1, err := os.Open(&quot;data/sample.csv&quot;)
if err != nil {
fmt.Println(err)
return
}
defer csvfile1.Close()
scanner := bufio.NewScanner(csvfile1)
csvfile2, err := os.Create(&quot;data/SingleColomReading.csv&quot;)
if err != nil {
fmt.Println(err)
return
}
writer := bufio.NewWriter(csvfile2)
nRecords := 0
for scanner.Scan() {
n, err := writer.Write(scanner.Bytes())
if err != nil {
fmt.Println(n, err)
return
}
err = writer.WriteByte(&#39;\n&#39;)
if err != nil {
fmt.Println(err)
return
}
if nRecords++; nRecords &gt;= 2 {
break
}
}
if err := scanner.Err(); err != nil {
fmt.Println(err)
return
}
err = writer.Flush()
if err != nil {
fmt.Println(err)
return
}
err = csvfile2.Close()
if err != nil {
fmt.Println(err)
return
}
}

答案2

得分: 3

以下是翻译好的内容:

更容易的方法是:

  • 将你的CSV文件读入一个字符串数组中(每个元素为一行),只读取前两行。
var lines []string
scanner := bufio.NewScanner(file)
nblines := 0
for scanner.Scan() {
    lines = append(lines, scanner.Text())
    if nblines++; nblines >= 2 {
        break
    }
}
  • 然后,你可以使用 range lines 将这两行写入目标文件中。
    lines 最多包含2个元素。
英文:

It owuld be easier to:

  • read your csv file into a string array (one line per element), for the two first lines only

      var lines []string
    scanner := bufio.NewScanner(file)
    nblines := 0
    for scanner.Scan() {
    lines = append(lines, scanner.Text())
    if nblines++; nblines &gt;= 2 {
    break
    }
    }
    
  • Then you can use a range lines to write those two lines in the destination file.
    lines includes at most 2 elements.

huangapple
  • 本文由 发表于 2014年10月18日 16:34:20
  • 转载请务必保留本文链接:https://go.coder-hub.com/26437796.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定