Avatar billede TMO14 Nybegynder
07. september 2009 - 12:55 Der er 3 kommentarer

Import fra CSV fil

Hej

Hvordan læser jeg smatest en EXCEL CSV fil i C# (VS 2008). Data skal efterfølgende validers og behandles af programmet.
Avatar billede sandrasmurf Nybegynder
07. september 2009 - 15:16 #1
Jeg ville personligt håndkode CSV læseren med en StreamReader og derefter gemme instanser af et objekt, der repræsenterer en række, i en Liste.

Her er et eksempel, hvor din CSV indeholder 3 kolonner, der er adskilt med ";" og har 3 forskellige typer(int, double, string).

// Klasse, der indeholder felter svarende til kolonne
// opbygningen i CSV filen. I dette tilfælde har CSV filen 3
// kolonner
public class MyRow
{
    public int MyInteger { get; private set; }
    public int MyDouble { get; private set; }
    public int MyString { get; private set; }

    public MyRow(int myInteger, double myDouble, string myString)
    {
        MyInteger = myInteger;
        MyDouble = myDouble;
        MyString = myString;
    }
}

public class DataReader
{
private static List<MyRow> ReadInput(string csvFilePath)
{
    // reads the Batch Shortest Path input from CSV
    List<MyRow> data = new List<MyRow>();

    StreamReader reader = new StreamReader(csvFilePath);
    // Uncomment this line if you have a header
    // reader.ReadLine(); // skip header line.
   
    string line;
    while ((line = reader.ReadLine()) != null)
    {
      string[] splitLine = line.Split(new string[1] { ";" }, StringSplitOptions.None);

      int firstColumn = string.IsNullOrEmpty(splitLine[0]) ? 0 : Int32.Parse(splitLine[0]);
      double secondColumn = string.IsNullOrEmpty(splitLine[1]) ? 0 : Double.Parse(splitLine[1]);
      string thirdColumn = string.IsNullOrEmpty(splitLine[3]) ? 0 : splitLine[2].ToString();
               
      data.Add(new MyRow(firstColumn, secondColumn, thirdColumn));
    }

    reader.Close();
    return data;
}
}

Så kan du løbe alle dine rækker igennem ved at sige

foreach(MyRow row in ReadInput(@"C://data.csv"))
{
    // Validate the row
    if(row.MyInteger > 0)
      ...
}
Avatar billede sandrasmurf Nybegynder
07. september 2009 - 15:20 #2
Hmmm. Must learn to use preview.

Ignorer -> // reads the Batch Shortest Path input from CSV
Det kommer fra min egen kode og har ikke noget med eksemplet at gøre.

Opdater -> string thirdColumn = string.IsNullOrEmpty(splitLine[3]) ? 0 : splitLine[2].ToString();

til -> string thirdColumn = string.IsNullOrEmpty(splitLine[2]) ? 0 : splitLine[2].ToString();

Ovenstående er ikke testet, så der er muligvis flere bugs. Men det skulle give dig en idé om, hvordan man kan kode en CSV læser.
Avatar billede windcape Praktikant
08. september 2009 - 07:22 #3
Tjah, jeg ville nok benytte noget LINQ magi, som samtidig kan validere dataen / dele af dataen

F.eks.:


Id, Name,Age
Windcape, 22



Dictionary<string, int> people =
    csv.Split('\n')
      .Skip(1)
      .Select(line => line.Split(','))
      .Where(values => values.Count() == 3)
      .ToDictionary(
            n => n[0],
            n => int.parse(n[1])
      );


Mulighederne med sådan et query er uendelige.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester