Avatar billede torotune Nybegynder
21. juni 2012 - 19:40 Der er 13 kommentarer og
1 løsning

Indlæsning af ASCII fil i .NET

Hej,

Jeg skal indlæse en ASCII-fil som bliver skudt ud gennem et eksternt system en gang hvert kvarter ca.

Filen er en eksport af en eller flere tabeller fra en database, og min idé er at samle op på data i filen, som jeg så efterfølgende vil skyde ind, mere struktureret, i en tabel i en SQL Server. En webapplikation vil være online til at tilgå disse data.

Er der et libary eller en bestemt metode der ville være best practice til den slags, ud over mulighederne i System.IO?

Et andet spørgsmål går på, at en indlæsning af en fil på et par MB og efterfølgende opdatering af en tabel i SQL, kan tage lidt tid. Hvad så med tilgængeligheden af tabellen imens importen står på? Ville man skulle lave en midlertidig tabel som dataene først sendes til eller kan man udnytte en form for cache eller lignende?

Mvh.
Avatar billede arne_v Ekspert
21. juni 2012 - 19:59 #1
System.IO til at laese filen og System.Data.Whatever til at gemme i databasen med boer virke fint. Lidt afhaengig af fil formatet kan der muligvis suppleres med andet.

Tabellen vil stadig vaere tilgaengelig mens du loader data ind i den.
Avatar billede torotune Nybegynder
21. juni 2012 - 20:07 #2
Hej Arne - tak for svaret. - Et sidespørgsmål, er eksport som ASCII-fil ikke lidt forældet i det hele taget? Det er det eneste der tilbydes, men ville en WebService eller en XML-fil ikke være mere at foretrække, eller er ASCII stadig et simpelt output til indlæsning, rent performance-mæssigt?
Avatar billede arne_v Ekspert
21. juni 2012 - 20:45 #3
Strengt taget er ASCII kun en encoding og ikke et format.

Men "ASCII-fil" bruges normalt omkring CSV eller andre lidt aeldre formater.

Ja. Hvis det fil format skulle defineres idag ville man nok vaelge XML fremfor CSV. Og encoding ville blive UTF-8 fremfor ASCII.

Web services vil betyde et skift fra offline til online og det er mere end bare et format skift.

Jeg er heller ikke overbevist om at en web service er den rigtige loesning her. Maaske ville det vaere bedre hvis det andet system publishede data til en message queue og dit system saa subscribede.
Avatar billede torotune Nybegynder
21. juni 2012 - 21:13 #4
Ok - så det vil sige at det højst sandsynligt er en CSV-fil jeg modtager? Men ja, ASCII er vel en encoding, men forvirrer lidt da extension på den er .ASC. Systemet der spytter der ud er ikke specielt up to date, så det er nok den eneste mulighed.

Men der er så ikke noget performance-mæssigt issue ved at læse ind i SQL'en en gang hvert kvarter via et cron job?

"Message queue" har jeg ikke hørt om før, hvor bruges dette? (for ren nysgerrigheds skyld)

:-)
Avatar billede arne_v Ekspert
21. juni 2012 - 22:36 #5
At indlaese nogle MB hvert kvarter vil nok give nogle toppe paa databaser server belastningen.

Men skal du bruge de data saa skal du jo bruge de data.
Avatar billede arne_v Ekspert
21. juni 2012 - 22:38 #6
Message queue bruges til asynch kommunikation. Ved request response sender A request til B og B sender response tilbage til A. Ved message queue sender A til queue og det kan modtages af ingen, en eller mange B.
Avatar billede janus_007 Nybegynder
23. juni 2012 - 00:37 #8
Hvor mange rækker snakker vi om hvert kvarter?
Avatar billede torotune Nybegynder
26. juni 2012 - 12:06 #9
Hej Arne - tak for info, jeg vil lige kigge lidt på læsningen der.

Jeg har netop modtaget en fil der indeholder ca. 17000 rækker/poster.

Der er op mod 17 kollonner for hver række/post.

Er det lige i overkanten hvert kvarter med hensyn til belastning?
Avatar billede arne_v Ekspert
26. juni 2012 - 15:05 #10
Medmindre der er LOB's i de raekker, saa er 17000 raekker faktisk ikke ret meget.

Jeg synes at du skal satse paa en meget simpel loesning og saa teste performance og lun bruge tid paa at optimere hvis der faktisk er et problem.

Sandsynligheden for problemer maa vaere lille.
Avatar billede torotune Nybegynder
28. juni 2012 - 10:26 #11
Hej igen - LOB's = Large objects?

Jeg har set et par mere kreative løsninger derude mht. indlæsning, men er den simpleste løsning ikke bare at loope igennem rækkerne og splitte op ved komma og så køre en INSERT?

Eller er det praktisk at loade det ind i et dataset først, og så loope det igennem med en INSERT?
Avatar billede arne_v Ekspert
29. juni 2012 - 00:57 #12
Start med den metode og se om det er hurtigt nok.

Hvis det skal have et lille pift saa bundt flere inserts i en transaction.

Hvis det skal have et stort pift saa kig paa bulkcopy.
Avatar billede torotune Nybegynder
29. juni 2012 - 10:32 #13
Ok - takker mange gange for undervisningen :-) Jeg prøver at kaste mig ud i det. Læg et svar :-)
Avatar billede arne_v Ekspert
29. juni 2012 - 14:54 #14
svar
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
Kurser inden for grundlæggende programmering

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