Avatar billede j3ppah Novice
25. september 2008 - 22:36 Der er 9 kommentarer og
1 løsning

read xls, cvs, remove dublicates.

Hej alle ekseperter. Nu sidder jeg med et kæmpe problem, hvor hints og lignende ikke en gang er nok...

Jeg er ved at lave et program der checke en .xls og en .cvs fil... den skal så gå ind og lave et checkup, og fjerne nogle linier...

forestil jer det her er xls filen.
    a      b      c              d            e
1    ID    Fisk    Beløb      et eller andet    altid
2  1232    ?      12,43    et eller andet    altid
3  4432    ?      500,00    et eller andet    altid
4  2231    ?      200,00    et eller andet    altid
5  1123    ?      800,00    et eller andet    altid

og her er så cvs filen.. (komma sepereret fil... stort set det samme som xls... åbnes også i excl..)

    a      b      c              d            e
1    tits    mad    Beløb        blabla          altid
2  1232    ?      12,43        blabla          altid
3  4432    ?      500,00      blabla          altid
4  2231    ?      125,00      blabla          altid
5  1123    ?      800,00      blabla          altid


Det programmet så skal gøre er at gå ind og checke om C-2 i xls er identisk med hvilken som helst af c'erne i cvs dokumentet...
og så gå videre til C-3 om checke om den er identisk med nogen af dem...

Programmet skal så skabe et 3 xls dokument. så alle dem der er identiske fra begge filer bliver slettet, og dem der ikke har fundet en match skal printes i det nye dokument...

Ved ikke om i forstår, men hvis der er spørgsmål kan i bare skrive... for det går virkeligt over min forstand...

Og i må virkeligt undskylde jeg stiller et så stort og krævende spørgsmål, men håber i kan hjælpe!
Avatar billede aaberg Nybegynder
26. september 2008 - 08:15 #1
Dette er faktisk ikke så svær en opgave som du umiddelbart tror det er.

Første problem: At læse xsl filen og csv filen ind i et C# program.
Den nemmeste måde at læse en xsl fil ind, er ved brug af ADO.net. Se følgende link for en OleDB connectionstring:
http://connectionstrings.com/?carrier=excel

en csv fil kan læses ind på samme måde. Se følgende link:
http://connectionstrings.com/?carrier=textfile

En alternativ måde at læse en csv fil på, er ved selv at lave noget logik som læser den. En sådan fil er trods alt veldig simpelt bygget op.

Andet problem: At sammenligne kolonne C i begge filer.
Først læser du hver række fra den ene fil ind i en HashTable eller Dictionary, hvor værdien fra kolonne C er Key. Derefter looper du igennem alle rækkerne fra den anden fil, og slår værdierne fra kolonne C op i din Hashtabel/Dictionary.

Til slut er det bare at skrive ikke-matchede rækker ned i en ny csv fil

Prøv at komme så langt du kan med dette. Jeg vil gerne hjælpe dig med noget kode, hvis du sidder helt fast.
Avatar billede j3ppah Novice
26. september 2008 - 08:44 #2
Du skulle vel aldrig have nogle eksempler hvor det er brugt i et program... ?...

Lige pt. skal brugeren af programmet ind og finde xls og cvs filen, via. nogle browse knapper jeg har lavet, som så selvfølgelig viser den path + filnavn og fil type i en text box...

og hvilken using system skal jeg have tilføjet før den vil genkende

OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Axls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";

den vil ikke genkende .4.0; i den sætning...

Well håber du kan hjælpe.. :)...


Men kunne virkeligt godt tænke mig et eksempel på hvordan et lignende program kunne være lavet, men første problem er jo lige at få loaded filerne ordenligt ;)..
Avatar billede aaberg Nybegynder
26. september 2008 - 09:53 #3
Her kommer i første omgang en metode til at loade xls filen. I metoden går den ud fra at tabben (tabellen) i Excel hedder "Ark1".

private DataTable xlsData;

private void LoadXlsDoc(string filename)
{
    OleDbConnection connection = new OleDbConnection(string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";", filename));

    OleDbCommand command = connection.CreateCommand();
    command.CommandText = "select * from [Ark1$]";

    OleDbDataAdapter adapt = new OleDbDataAdapter(command);
    xlsData = new DataTable();
    adapt.Fill(xlsData);
}
Avatar billede aaberg Nybegynder
26. september 2008 - 10:27 #4
Her er lidt kode for at loade en csv fil:

DataTable csvData;

private void LoadCsv(string filename)
{
    StreamReader reader = new StreamReader(filename);
    bool firstLine = true;
    csvData = new DataTable();

    try
    {
        while (reader.Peek() >= 0)
        {
            string rowString = reader.ReadLine();
            string[] cells = rowString.Split(';');

            if (firstLine)
            {
                foreach (string headerCell in cells)
                {
                    csvData.Columns.Add(headerCell);
                }
                firstLine = false;
            }
            else
            {
                DataRow row = csvData.NewRow();
                for (int colIdx = 0; colIdx < csvData.Columns.Count; colIdx++)
                {
                    row[colIdx] = cells[colIdx];
                }
                csvData.Rows.Add(row);
            }
        }
    }
    finally
    {
        reader.Close();
    }
}

Sig til, hvis du for brug for mere hjælp :-)
Avatar billede j3ppah Novice
07. oktober 2008 - 13:17 #5
Kunne overhoved ikke få det til at virke ordenligt :D...
Kan godt være jeg havde taget mig en ALT for stor mundfuld her...
Altså kan sagtens loade CVS filen osv. og XLS filen... hmm... men alt med sheets og collums kan jeg slet ikke få til at virke...kunne forestille mig det ville blive alt for indviket for mig :(... gad satme ellers godt lige have det til at virke...

Men kan være jeg skal falde totalt back to basic, og så lave det dirrekte i Excel..
Avatar billede aaberg Nybegynder
07. oktober 2008 - 13:49 #6
Bare så jeg forstår det helt rigtigt: Når du har loadet de to filer, skal programmet finde alle de rows, hvor beløbet i kolonne C kun forekommer tilsammen 1 gang i de to datasæt.

Kolonne C, er det kolonnen med alle ?-tegnene, eller kolonnen med beløbet?

Hvis du vil, kan jeg godt lave et eksempel på, hvordan du får det til at virke? Jeg har arbejdet meget med lignende problemstillinger, så jeg tror nok jeg skal få det til at virke.

Kan du da sende en zip fil med de 2 datasæt til: exp snabel-a aaberg punktum cc
Hvis det er konfidentielle data, kan du eventuelt lave et par test eksempler i stedet.

Det kan være jeg får tid til at se på det allerede i aften.
Avatar billede j3ppah Novice
07. oktober 2008 - 14:19 #7
Prøv eventuelt at checke her...
http://www.eksperten.dk/spm/848186

Sheet 1 er CSV og sheet 2 er xls filen... (har bare lige loaded begge i en Xls
Avatar billede j3ppah Novice
20. oktober 2008 - 08:22 #8
Smider du lige et svar når du har tid... droppede projektet, og lavede det i exls i stedet.
Avatar billede aaberg Nybegynder
20. oktober 2008 - 08:31 #9
Beklager, jeg havde glemt alt om dette! :-/ Jeg fik lidt travlt den aften, og så forsvandt det ud af mit hoved!

Det er sådan det går! Men det er godt at du kom frem til en løsning :-)
Avatar billede j3ppah Novice
20. oktober 2008 - 10:13 #10
Hehe... ja... Men mange tak for din tid, og hjælp!
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