Efficiently Reading and Storing CSV Data into Arrays Using C#

Introduction

Reading and storing data from a CSV (Comma-Separated Values) file is a common task in many applications. This tutorial will guide you through the process of reading a CSV file with semicolon-separated values, parsing its contents, and storing each column into separate arrays using C#. We’ll explore multiple methods including manual parsing, LINQ, and leveraging third-party libraries.

Understanding CSV Format

A CSV file is typically used to store tabular data where each line represents a record and fields within the records are separated by delimiters like commas or semicolons. In this tutorial, we focus on files where semicolon (;) is the delimiter.

Method 1: Manual Parsing with StreamReader

Step-by-Step Guide:

  1. Setup Your Project: Create a new C# Console Application.

  2. Import Necessary Namespaces:

    using System;
    using System.Collections.Generic;
    using System.IO;
    
  3. Read and Parse CSV Data:

    • Use StreamReader to read the file line by line.
    • Split each line using the semicolon delimiter.
  4. Store Values in Lists:

    • Create two lists, one for each column.
    • Add parsed values into respective lists.
  5. Convert Lists to Arrays (Optional):

    • Use ToArray() method if you need an array format.
static void Main(string[] args)
{
    string filePath = @"C:\test.csv";
    
    using (var reader = new StreamReader(filePath))
    {
        List<string> column1 = new List<string>();
        List<string> column2 = new List<string>();

        while (!reader.EndOfStream)
        {
            var line = reader.ReadLine();
            var values = line.Split(';');

            if (values.Length == 2) // Ensure there are two columns
            {
                column1.Add(values[0]);
                column2.Add(values[1]);
            }
        }

        // Optionally convert to arrays
        string[] array1 = column1.ToArray();
        string[] array2 = column2.ToArray();

        // Display results
        Console.WriteLine("Column 1:");
        foreach (var item in array1)
            Console.WriteLine(item);

        Console.WriteLine("\nColumn 2:");
        foreach (var item in array2)
            Console.WriteLine(item);
    }
}

Considerations:

  • This method handles basic CSV parsing but does not account for edge cases such as values containing semicolons or quoted fields.

Method 2: Using LINQ

LINQ provides a more concise way to process collections. Here’s how you can use it:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

static void Main(string[] args)
{
    string filePath = @"C:\test.csv";
    
    var lines = File.ReadAllLines(filePath).Select(line => line.Split(';'));

    var column1 = lines.Select(parts => parts[0]).ToArray();
    var column2 = lines.Select(parts => parts[1]).ToArray();

    // Display results
    Console.WriteLine("Column 1:");
    foreach (var item in column1)
        Console.WriteLine(item);

    Console.WriteLine("\nColumn 2:");
    foreach (var item in column2)
        Console.WriteLine(item);
}

Considerations:

  • This approach assumes well-formed data without semicolons within fields.

Method 3: Using CsvHelper Library

For more robust CSV parsing, consider using a library like CsvHelper. It handles edge cases such as quoted fields and custom delimiters.

Installation:

Install via NuGet Package Manager with the command:

Install-Package CsvHelper

Sample Code:

using System;
using System.Collections.Generic;
using System.IO;
using CsvHelper;
using CsvHelper.Configuration;

class Program
{
    static void Main()
    {
        string filePath = @"C:\test.csv";
        
        using (var reader = new StreamReader(filePath))
        using (var csv = new CsvReader(reader, new CsvConfiguration(CultureInfo.InvariantCulture)
        {
            Delimiter = ";"
        }))
        {
            var records = new List<(string Column1, string Column2)>();
            
            while (csv.Read())
            {
                var record = new { Column1 = csv.GetField<string>(0), Column2 = csv.GetField<string>(1) };
                records.Add((record.Column1, record.Column2));
            }

            var column1Array = records.Select(record => record.Item1).ToArray();
            var column2Array = records.Select(record => record.Item2).ToArray();

            // Display results
            Console.WriteLine("Column 1:");
            foreach (var item in column1Array)
                Console.WriteLine(item);

            Console.WriteLine("\nColumn 2:");
            foreach (var item in column2Array)
                Console.WriteLine(item);
        }
    }
}

Considerations:

  • CsvHelper handles complex CSV scenarios gracefully and is a robust choice for production code.

Conclusion

Depending on your needs, you can choose between manual parsing for simple files, LINQ for concise syntax, or third-party libraries like CsvHelper for comprehensive features. Each method has its advantages and limitations; choosing the right one depends on the complexity of your CSV data and project requirements.

Leave a Reply

Your email address will not be published. Required fields are marked *