Handling CSV Files in Go

List Topics
February 18, 2025
No Comments
7 min read

In Go, CSV (Comma-Separated Values) files are a common format for storing tabular data. The encoding/csv package in Go allows you to read and write CSV files efficiently. Below, we'll explain how to read from and write to CSV files in Go.

1️⃣ Reading CSV Files

To read a CSV file in Go, we use the csv.NewReader function from the encoding/csv package. This function helps to parse the file line by line.

Example: Reading a CSV File

Go
package main

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

func main() {
	// Open the CSV file
	file, err := os.Open("data.csv")
	if err != nil {
		fmt.Println("Error opening file:", err)
		return
	}
	defer file.Close()

	// Create a new CSV reader
	reader := csv.NewReader(file)

	// Read all records from the CSV file
	records, err := reader.ReadAll()
	if err != nil {
		fmt.Println("Error reading CSV:", err)
		return
	}

	// Print all records
	for _, record := range records {
		fmt.Println(record) // Each record is a slice of strings
	}
}

🔹 Output (assuming data.csv contains this data):

Bash
[Name Age City]
[Alice 30 New York]
[Bob 25 Los Angeles]
[Charlie 35 Chicago]

👉 In this example:

  • os.Open opens the CSV file.
  • csv.NewReader creates a new CSV reader.
  • reader.ReadAll reads all the records from the file and returns them as a slice of string slices (where each inner slice is a row from the CSV).

2️⃣ Writing to CSV Files

To write data to a CSV file in Go, you use the csv.NewWriter function. This allows you to write individual records (rows) to the file.

Example: Writing to a CSV File

Go
package main

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

func main() {
	// Create a new CSV file
	file, err := os.Create("output.csv")
	if err != nil {
		fmt.Println("Error creating file:", err)
		return
	}
	defer file.Close()

	// Create a new CSV writer
	writer := csv.NewWriter(file)

	// Write records (rows) to the CSV file
	records := [][]string{
		{"Name", "Age", "City"},
		{"Alice", "30", "New York"},
		{"Bob", "25", "Los Angeles"},
		{"Charlie", "35", "Chicago"},
	}

	for _, record := range records {
		err := writer.Write(record)
		if err != nil {
			fmt.Println("Error writing record:", err)
			return
		}
	}

	// Write any buffered data to the file
	writer.Flush()

	// Check if there was an error during the flush
	if err := writer.Error(); err != nil {
		fmt.Println("Error flushing writer:", err)
		return
	}

	fmt.Println("CSV file created successfully")
}

🔹 Output (the content of output.csv):

Bash
Name,Age,City
Alice,30,New York
Bob,25,Los Angeles
Charlie,35,Chicago

👉 In this example:

  • os.Create creates a new CSV file for writing.
  • csv.NewWriter creates a CSV writer.
  • writer.Write writes each record (row) to the CSV file.
  • writer.Flush writes any buffered data to the file and ensures all content is saved.

3️⃣ Reading CSV Line by Line

If you want to read a CSV file line by line (instead of reading the entire file at once), you can use csv.Reader.Read.

Example: Reading CSV Line by Line

Go
package main

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

func main() {
	// Open the CSV file
	file, err := os.Open("data.csv")
	if err != nil {
		fmt.Println("Error opening file:", err)
		return
	}
	defer file.Close()

	// Create a new CSV reader
	reader := csv.NewReader(file)

	// Read CSV line by line
	for {
		record, err := reader.Read()
		if err != nil {
			// End of file reached or error
			break
		}
		fmt.Println(record) // Print each record (row)
	}
}

🔹 Output (assuming data.csv contains this data):

Bash
[Name Age City]
[Alice 30 New York]
[Bob 25 Los Angeles]
[Charlie 35 Chicago]

👉 This approach reads each line from the CSV file and processes it one by one.

4️⃣ Customizing CSV Delimiters

By default, Go’s CSV package uses a comma , as the delimiter, but you can change the delimiter if your file uses a different one (like a semicolon ;).

Example: Using a Custom Delimiter

Go
package main

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

func main() {
	// Open the CSV file
	file, err := os.Open("data.csv")
	if err != nil {
		fmt.Println("Error opening file:", err)
		return
	}
	defer file.Close()

	// Create a new CSV reader with a custom delimiter
	reader := csv.NewReader(file)
	reader.Comma = ';' // Set the delimiter to semicolon

	// Read all records from the CSV file
	records, err := reader.ReadAll()
	if err != nil {
		fmt.Println("Error reading CSV:", err)
		return
	}

	// Print all records
	for _, record := range records {
		fmt.Println(record) // Each record is a slice of strings
	}
}

🔹 Output (assuming data.csv has semicolons as delimiters):

Bash
[Name Age City]
[Alice 30 New York]
[Bob 25 Los Angeles]
[Charlie 35 Chicago]

👉 The delimiter is changed to semicolon (;) using reader.Comma.

Summary:

  • Reading CSV: Use csv.NewReader to read from a CSV file and Read or ReadAll to parse the content.
  • Writing CSV: Use csv.NewWriter to write records to a CSV file with Write and Flush.
  • Line-by-Line Reading: You can read CSV files line by line using Read.
  • Custom Delimiters: Customize delimiters by setting reader.Comma.

This makes Go a powerful language for working with CSV files, providing a simple interface for reading and writing tabular data.


CSV ফাইলের সাথে কাজ করা Go তে

Go তে CSV (Comma-Separated Values) ফাইলগুলি একটি সাধারণ ফরম্যাট যা টেবিলার ডেটা সংরক্ষণের জন্য ব্যবহৃত হয়। CSV ফাইলগুলির সাথে কাজ করতে Go এর encoding/csv প্যাকেজ ব্যবহার করা হয়। এই প্যাকেজটি আপনাকে CSV ফাইল থেকে ডেটা পড়তে এবং লিখতে সাহায্য করে। নিচে আমরা CSV ফাইলের সাথে কাজ করার জন্য প্রয়োজনীয় কিছু উদাহরণ আলোচনা করব।

1️⃣ CSV ফাইল পড়া

CSV ফাইল পড়তে, Go তে csv.NewReader ফাংশনটি ব্যবহার করা হয়। এটি ফাইলটি এক লাইনে এক করে পড়তে সাহায্য করে।

উদাহরণ: CSV ফাইল পড়া

Go
package main

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

func main() {
	// CSV ফাইলটি ওপেন করুন
	file, err := os.Open("data.csv")
	if err != nil {
		fmt.Println("ফাইল খুলতে সমস্যা:", err)
		return
	}
	defer file.Close()

	// একটি নতুন CSV রিডার তৈরি করুন
	reader := csv.NewReader(file)

	// CSV ফাইল থেকে সমস্ত রেকর্ড পড়ুন
	records, err := reader.ReadAll()
	if err != nil {
		fmt.Println("CSV পড়তে সমস্যা:", err)
		return
	}

	// সমস্ত রেকর্ড প্রিন্ট করুন
	for _, record := range records {
		fmt.Println(record) // প্রতিটি রেকর্ড একটি স্ট্রিং স্লাইস
	}
}

🔹 আউটপুট (ধরা যাক data.csv ফাইলের মধ্যে এই ডেটা আছে):

Bash
[Name Age City]
[Alice 30 New York]
[Bob 25 Los Angeles]
[Charlie 35 Chicago]

👉 এই উদাহরণে:

  • os.Open ফাইলটি খুলতে ব্যবহার করা হয়।
  • csv.NewReader একটি নতুন CSV রিডার তৈরি করে।
  • reader.ReadAll ফাইল থেকে সমস্ত রেকর্ড পড়ে একটি স্ট্রিং স্লাইস আকারে ফেরত দেয়।

2️⃣ CSV ফাইলে লেখা

CSV ফাইলে ডেটা লিখতে, Go তে csv.NewWriter ফাংশনটি ব্যবহার করা হয়। এটি আপনাকে এক বা একাধিক রেকর্ড (রো) ফাইলটিতে লিখতে সাহায্য করে।

উদাহরণ: CSV ফাইলে লেখা

Go
package main

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

func main() {
	// একটি নতুন CSV ফাইল তৈরি করুন
	file, err := os.Create("output.csv")
	if err != nil {
		fmt.Println("ফাইল তৈরি করতে সমস্যা:", err)
		return
	}
	defer file.Close()

	// একটি নতুন CSV লেখক তৈরি করুন
	writer := csv.NewWriter(file)

	// CSV ফাইলে রেকর্ড (রো) লিখুন
	records := [][]string{
		{"Name", "Age", "City"},
		{"Alice", "30", "New York"},
		{"Bob", "25", "Los Angeles"},
		{"Charlie", "35", "Chicago"},
	}

	for _, record := range records {
		err := writer.Write(record)
		if err != nil {
			fmt.Println("রেকর্ড লিখতে সমস্যা:", err)
			return
		}
	}

	// যেকোনো বাফারড ডেটা ফাইলে লিখুন
	writer.Flush()

	// ফ্লাশের সময় যদি কোনো সমস্যা হয়
	if err := writer.Error(); err != nil {
		fmt.Println("লেখক ফ্লাশ করতে সমস্যা:", err)
		return
	}

	fmt.Println("CSV ফাইল সফলভাবে তৈরি হয়েছে")
}

🔹 আউটপুট (ধরা যাক output.csv ফাইলের মধ্যে এই ডেটা থাকবে):

Bash
Name,Age,City
Alice,30,New York
Bob,25,Los Angeles
Charlie,35,Chicago

👉 এই উদাহরণে:

  • os.Create একটি নতুন CSV ফাইল তৈরি করে।
  • csv.NewWriter একটি CSV লেখক তৈরি করে।
  • writer.Write প্রতিটি রেকর্ড (রো) ফাইলে লেখে।
  • writer.Flush যেকোনো বাফারড ডেটা ফাইলে লেখে এবং সবকিছু সংরক্ষিত হয়।

3️⃣ CSV ফাইল এক লাইনে পড়া

যদি আপনি CSV ফাইলটি এক লাইনে এক করে পড়তে চান, তাহলে csv.Reader.Read ফাংশনটি ব্যবহার করতে পারেন।

উদাহরণ: CSV এক লাইনে পড়া

Go
package main

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

func main() {
	// CSV ফাইলটি ওপেন করুন
	file, err := os.Open("data.csv")
	if err != nil {
		fmt.Println("ফাইল খুলতে সমস্যা:", err)
		return
	}
	defer file.Close()

	// একটি নতুন CSV রিডার তৈরি করুন
	reader := csv.NewReader(file)

	// CSV এক লাইনে এক করে পড়ুন
	for {
		record, err := reader.Read()
		if err != nil {
			// ফাইলের শেষে পৌঁছানো বা কোনো ত্রুটি
			break
		}
		fmt.Println(record) // প্রতিটি রেকর্ড (রো) প্রিন্ট করুন
	}
}

🔹 আউটপুট (ধরা যাক data.csv ফাইলের মধ্যে এই ডেটা আছে):

Bash
[Name Age City]
[Alice 30 New York]
[Bob 25 Los Angeles]
[Charlie 35 Chicago]

👉 এই পদ্ধতিতে CSV ফাইলের প্রতিটি লাইন এক করে পড়া হয় এবং প্রসেস করা হয়।

4️⃣ কাস্টম ডেলিমিটার ব্যবহার করা

ডিফল্টভাবে, Go এর CSV প্যাকেজ কমা (,) ডেলিমিটার ব্যবহার করে, তবে আপনি যদি অন্য কোনো ডেলিমিটার (যেমন সেমিকোলন ;) ব্যবহার করতে চান, তবে আপনি সেটি কনফিগার করতে পারেন।

উদাহরণ: কাস্টম ডেলিমিটার ব্যবহার করা

Go
package main

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

func main() {
	// CSV ফাইলটি ওপেন করুন
	file, err := os.Open("data.csv")
	if err != nil {
		fmt.Println("ফাইল খুলতে সমস্যা:", err)
		return
	}
	defer file.Close()

	// একটি নতুন CSV রিডার তৈরি করুন কাস্টম ডেলিমিটার সহ
	reader := csv.NewReader(file)
	reader.Comma = ';' // সেমিকোলন ডেলিমিটার ব্যবহার করুন

	// CSV ফাইল থেকে সমস্ত রেকর্ড পড়ুন
	records, err := reader.ReadAll()
	if err != nil {
		fmt.Println("CSV পড়তে সমস্যা:", err)
		return
	}

	// সমস্ত রেকর্ড প্রিন্ট করুন
	for _, record := range records {
		fmt.Println(record) // প্রতিটি রেকর্ড একটি স্ট্রিং স্লাইস
	}
}

🔹 আউটপুট (ধরা যাক data.csv ফাইলে সেমিকোলন ডেলিমিটার ব্যবহার করা হয়েছে):

Bash
[Name Age City]
[Alice 30 New York]
[Bob 25 Los Angeles]
[Charlie 35 Chicago]

👉 এখানে, reader.Comma = ';' লাইনটি ব্যবহার করে সেমিকোলন ডেলিমিটার সেট করা হয়েছে।

সারাংশ:

  • CSV পড়া: csv.NewReader ব্যবহার করে CSV ফাইল পড়া হয় এবং Read বা ReadAll দিয়ে ডেটা পার্স করা হয়।
  • CSV লেখা: csv.NewWriter ব্যবহার করে CSV ফাইলে রেকর্ড লেখা হয়, Write এবং Flush ফাংশনগুলির মাধ্যমে।
  • লাইন বাই লাইন পড়া: CSV ফাইল এক লাইন এক করে পড়তে Read ব্যবহার করা হয়।
  • কাস্টম ডেলিমিটার: reader.Comma সেট করে কাস্টম ডেলিমিটার ব্যবহার করা যায়।

Go তে CSV ফাইলের সাথে কাজ করার জন্য এটি একটি শক্তিশালী এবং সহজ ইন্টারফেস প্রদান করে, যা আপনাকে টেবিলার ডেটা খুব সহজেই পড়তে এবং লিখতে সাহায্য করে।

©2025 Linux Bangla | Developed & Maintaind by Linux Bangla.