mboost-dp1
Dynamisk array-allokering
- Forside
- ⟨
- Forum
- ⟨
- Programmering
Mojn!
Har lidt bøvl med et program. Har en input-fil med forskellige oplysninger, som jeg skal have lavet om til en kommasepereret fil. Ikke det store problem i sig selv, men der er lige en catch.
Outputformatet er:
2,X,dato, voresSEnr,landekode,kundesSEnr,beløb
Problemet er, at i input-filen kan en bestemt kunde godt optræde flere gange, men i output-filen må kunden kun optræde én gang.
Jeg har lavet et string-array hvor alle linjerne bliver gemt, men jeg kan ikke lige gennemskue, hvordan jeg skal søge i det array efter kundenummeret - og hvis det eksisterer, hvordan jeg så skal lægge beløbet sammen.
Jeg overvejede at lave et multidimensionelt array, men så vidt jeg kan se, så kan man ikke lave et der bliver dynamisk allokeret alt efter størrelsen.
Har i nogle bud på, hvad jeg kan gøre?
Har lidt bøvl med et program. Har en input-fil med forskellige oplysninger, som jeg skal have lavet om til en kommasepereret fil. Ikke det store problem i sig selv, men der er lige en catch.
Outputformatet er:
2,X,dato, voresSEnr,landekode,kundesSEnr,beløb
Problemet er, at i input-filen kan en bestemt kunde godt optræde flere gange, men i output-filen må kunden kun optræde én gang.
Jeg har lavet et string-array hvor alle linjerne bliver gemt, men jeg kan ikke lige gennemskue, hvordan jeg skal søge i det array efter kundenummeret - og hvis det eksisterer, hvordan jeg så skal lægge beløbet sammen.
Jeg overvejede at lave et multidimensionelt array, men så vidt jeg kan se, så kan man ikke lave et der bliver dynamisk allokeret alt efter størrelsen.
Har i nogle bud på, hvad jeg kan gøre?
du skal aldrigt bruge arrays(medmindre du koder c) brug en mere sikker container, f.eks. en vector.
i dette tilfælde skal du bruge en hashmap/dictionary alt efter hvilket sprog du bruger.
i dette tilfælde skal du bruge en hashmap/dictionary alt efter hvilket sprog du bruger.
#10
Det er bare super-fail hvis kunden ikke har praecis samme data, eller det ikke er den 'sidste' der indlaeses, der skal vaere den der gemmes :)
Han kunne gemme det i endnu en vector, saa han faar alle entries med for alle kunder og saa finde noget at sortere efter bagefter. :)
- læs ind i den (duplikater bliver automatisk overskrevet når du bruger f.eks. kundeSEnr som key)
Det er bare super-fail hvis kunden ikke har praecis samme data, eller det ikke er den 'sidste' der indlaeses, der skal vaere den der gemmes :)
Han kunne gemme det i endnu en vector, saa han faar alle entries med for alle kunder og saa finde noget at sortere efter bagefter. :)
#12
...?
Saa hvis jeg har 2 styk data:
SE, Navn, Ordrenummer
2300, fido, 2300
2300, fido, 2301
Saa er det OK at der bare staar 2301 i ordrenummer?
[add]
Han skal laegge beloebet sammen, saa er det ikke nok at den overskriver.
...?
Saa hvis jeg har 2 styk data:
SE, Navn, Ordrenummer
2300, fido, 2300
2300, fido, 2301
Saa er det OK at der bare staar 2301 i ordrenummer?
[add]
og hvis det eksisterer, hvordan jeg så skal lægge beløbet sammen.
Han skal laegge beloebet sammen, saa er det ikke nok at den overskriver.
fidomuh (13) skrev:
Saa hvis jeg har 2 styk data:
SE, Navn, Ordrenummer
2300, fido, 2300
2300, fido, 2301
Saa er det OK at der bare staar 2301 i ordrenummer?
Det var hvad der blev bedt om.
i output-filen må kunden kun optræde én gang
fidomuh (13) skrev:
Han skal laegge beloebet sammen, saa er det ikke nok at den overskriver.
Korrekt. Så er han nødt til at opdatere. Men Dictionary<string,X> virker også fint til det.
Hvis nogen skulle have interesse, så lavede jeg en liste inspireret af:
http://www.c-sharpcorner.com/uploadfile/camurphy/c...
Sorterede mine poster først efter landekode og så efter SENr via:
og så et fint lille stykke slamkode til at tjekke om der er ens SEnr efter hinanden:
Der mangler så bare lige et tjek på, om amount er et plusbeløb eller et minusbeløb, men det er småting. :)
Tak for hjælpen til alle!
http://www.c-sharpcorner.com/uploadfile/camurphy/c...
Sorterede mine poster først efter landekode og så efter SENr via:
kunder = kunder
.OrderBy(x => x.countryCode)
.ThenBy(x => x.custSENr)
.ToList();
og så et fint lille stykke slamkode til at tjekke om der er ens SEnr efter hinanden:
int numberOfRecs = kunder.Count; //hent antal records
int counter1 = 0;
int counter2 = 1;
while (counter2 < numberOfRecs)
{
if (kunder[counter1].custSENr == kunder[counter2].custSENr)
{
kunder[counter1].amount = kunder[counter1].amount + kunder[counter2].amount;
kunder.RemoveAt(counter2);
numberOfRecs--;
}
counter1++;
counter2++;
}
Der mangler så bare lige et tjek på, om amount er et plusbeløb eller et minusbeløb, men det er småting. :)
Tak for hjælpen til alle!
Totally!XorpiZ (20) skrev:og så et fint lille stykke slamkode til at tjekke om der er ens SEnr efter hinanden:
Vi kunne jo også linqify det (Og så slipper du for at skulle sortere det først!)
var result =
from kunde in kunder
group kunde by kunde.custSENr
into grouped
select new Kunde()
{
custSENr = grouped.Key,
Amount = grouped.Sum(k => k.Amount),
};
#27
Måske. Men det er jo netop en groupering og herefter en applikation af en funktion herefter.
Hvis jeg har forstået ideen rigtig, er det at groupere, og lægge alting i gruppen sammen, her til et enkelt produkt.
Afhæning af datakilden, kunne man nok godt læse det direkte ud i det grouperede format med LINQ, som kunne blive pænere end alm. kode.
Det er så en smagssag, om man kan lide DSL eller ej :p
Måske. Men det er jo netop en groupering og herefter en applikation af en funktion herefter.
Hvis jeg har forstået ideen rigtig, er det at groupere, og lægge alting i gruppen sammen, her til et enkelt produkt.
Afhæning af datakilden, kunne man nok godt læse det direkte ud i det grouperede format med LINQ, som kunne blive pænere end alm. kode.
Det er så en smagssag, om man kan lide DSL eller ej :p
arne_v (26) skrev:#20
Jeg er iøvrigt ikke overbevist om at koden virker korrekt.
Når du kalder RemoveAt *og* tæller counter2 op - kan der så ikke smutte en igennem?
Jo - det har jeg også rettet siden. Nu tæller den kun counter1 & 2 op, hvis der ikke er et hit. :)
LINQ løsningen ser enkel ud, men jeg forstår den ikke hehe. Så hellere nogle gode gammeldags løkker. :D
arne_v (31) skrev:Så burde du skrive det.
Der skal nok være en eller anden som om 5 år opggogler og kopierer koden.
God ide - jeg paster lige den opdaterede version i løbet af i morgen, når den er testet igennem.
Og du har nok ret i din antagelse, eftersom det program jeg laver skal bruges til dataudtræk fra Navision og så til momsindgivelse til Skat. Kunne forestille mig, at jeg ikke er den eneste i DK, der har det problem, da Skat skifter format nu her. :)
I øvrigt, så var vores gamle "program" et VB script på knapt 900 linjer uden kommentarer. Det var helt tilbage fra 2004 og var kropumuligt at rette noget som helst i, da alle variabel navne hed X, Y og tal, groft sagt.
Men ok, det har nok ikke været meningen, at det skulle rettes i :)
For satan jeg er glemsom.. man skulle ikke tro, at jeg kun er 26 :/
Så må der grines af min slamkode og mine kommentarer.. jeg har ikke lige gidet fjerne dem :D
int counter1 = 0;
int counter2 = 1;
while (counter2 < numberOfRecs)
{
//Tjek om to efterfølgende rækker (række1 & 2) er ens - hvis ja, slet række 2 og tilføj beløbet til række 1
//Tjek igen om række1 & 2 er ens - hvis nej, gå videre og tjek om række 2 & 3 er ens
if (kunder[counter1].custSENr == kunder[counter2].custSENr)
{
//Tjek om beløbet i række2 er negativt
if (kunder[counter2].amount < 0)
{
//Tjek om beløbet i række1 er negativt (hvis ja, så skal de to negative tal lægges sammen og ikke trækkes fra)
if(kunder[counter1].amount < 0)
kunder[counter1].amount = kunder[counter1].amount + kunder[counter2].amount;
else
kunder[counter1].amount = kunder[counter1].amount - kunder[counter2].amount;
}
else
{
kunder[counter1].amount = kunder[counter1].amount + kunder[counter2].amount;
}
//Fjern linjen, der bliver lagt sammen med sin "makker"
kunder.RemoveAt(counter2);
//Træk én fra antal rækker, da vi sletter en ovenfor
numberOfRecs--;
}
else
{
counter1++;
counter2++;
}
}
Så må der grines af min slamkode og mine kommentarer.. jeg har ikke lige gidet fjerne dem :D
Er listen sorteret efter custSENr? Hvis ikke kan du godt risikere dupletter.
oh, og hvad går det gøgl ud på med at tjekke om den ene eller den anden er negativ?
oh, og hvad går det gøgl ud på med at tjekke om den ene eller den anden er negativ?
Ja det er den. Først efter landekode og så efter SEnr, så den skulle være i vinkel.
Der er nok en smartere måde at lave tjekket på, men du får lige et eksempel:
amount1 er -10
amount2 er -10
oprindeligt havde jeg bare en funktion, der lagde dem sammen eller trak dem fra hinanden, alt efter om amount1 var positiv eller negativ.
I ovenstående eksempel lavede den altså -10 - -10, hvilket gav 0, istedet for -20, som var planen. Så jeg lavede et grimt lille hack, så det virkede som det skulle :)
Der er nok en smartere måde at lave tjekket på, men du får lige et eksempel:
amount1 er -10
amount2 er -10
oprindeligt havde jeg bare en funktion, der lagde dem sammen eller trak dem fra hinanden, alt efter om amount1 var positiv eller negativ.
I ovenstående eksempel lavede den altså -10 - -10, hvilket gav 0, istedet for -20, som var planen. Så jeg lavede et grimt lille hack, så det virkede som det skulle :)
Gå til top
Opret dig som bruger i dag
Det er gratis, og du binder dig ikke til noget.
Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.