Läsa ett "PIC S9(n)" fält med Struct i Python.

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
sodjan
EF Sponsor
Inlägg: 43245
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Läsa ett "PIC S9(n)" fält med Struct i Python.

Inlägg av sodjan »

Har problem att läsa fält från en datafil som är skriven från Cobol
med PIC fält i stil med:

Kod: Markera allt

...
        05 PATYP                PIC 9.
        05 PABEANT              PIC S9(7).
        05 PALEVDAT             PIC 9(5).
        05 PATRIGGANT           PIC S9(4).
        05 PASTATUS             PIC X.
...
Data ser ut så här (för samma del definitionen ovan gäller för):

Kod: Markera allt

...2000002D13222000{I...
...2000001F13222000{I...
...1000012{13232000{I...
...1000006{13232000{I...
...1000003{13232000{I...
...1000003{13232000{I...
...1000001{13232000{I...
...1000006{13232000{I...
D.v.s att t.ex "000002D" eller "000012{" motsvarar fältet PABEANT i definitionen
och de ska ha det numeriska värderna 24 resp 120.

"String" i funktioner Struct ger så klart en sträng som "000012{", men det fungerar inte.
Jag har testad några olika numeriska datatyper som "SBInt16" och "SBIint32", men de förväntar
sig sannolikt packade binära fält, inte "singed character numeric" som detta är.

Så, någon har läst data i Python skrivet från Cobol som har någon idé?
Användarvisningsbild
hanzibal
EF Sponsor
Inlägg: 2499
Blev medlem: 7 september 2010, 20:54:58
Ort: Malmö/Lund

Re: Läsa ett "PIC S9(n)" fält med Struct i Python.

Inlägg av hanzibal »

Nu har jag ju aldrig pysslat med Python och borde kanske inte svara men jag förstår inte riktigt definitionerna, vad innebär t.ex "PIC 9"?

Om man tittar på t.ex "PIC S9(7)" så antar jag att S:et står för "med tecken" och att 7:an anger längden i antal tecken och jag får då inte ihop det med de båda exempel du anger som f.ö. torde vara 45 resp 18 tolkade som hexadecimala värden.
sodjan
EF Sponsor
Inlägg: 43245
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Läsa ett "PIC S9(n)" fält med Struct i Python.

Inlägg av sodjan »

"PIC" = "Picture", d.v.s hur variablen är representerad i minnet.

"PIC 9" = numeriskt med ett tecken. Kan ha värdet 0-9 och lagras
som hex 30 - 39 (alltså med ASCII värdet). I princip samma sak
som "PIC X" som lagrar valfri text inkl 0-9 så klart. Dock är det då
just *text* och kan inte användas för beräkningar.

PIC 9(n) och PIC X(n) kan mappas (i princip en union) mot varandra
så att samma data kan hanteras som både numeriskt och som text.

PIC S9(7) betyder "signed numeric" med 7 positioner. -9999999 - +9999999.
Tecken anges genom att sista siffran/byten får ett tillägg.

> tolkade som hexadecimala värden.

Det är inte hex, det är ASCII.

Om man vill ha rent binära fält så skriver man på lite annorlunda sätt,
t.ex "PIC S9(9) BINARY" för en 32 bits signed integer. Om det blir en
16, 32, eller 64 bit integer beror på vad det står inom (n). Det allokeras
vad som krävs för t.ex 9 signifikanta siffror som i exemplet.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Läsa ett "PIC S9(n)" fält med Struct i Python.

Inlägg av Magnus_K »

Ett långskott då jag inte har en aning om vad du pratar om men hjälper denna tut'en något? -> COBOL tutorial
(observera flera sidor)
sodjan
EF Sponsor
Inlägg: 43245
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Läsa ett "PIC S9(n)" fält med Struct i Python.

Inlägg av sodjan »

Hm, kanske inte direkt just *den* sidan, men en som länkades därifrån:
http://www.3480-3590-data-conversion.co ... ields.html
Där under "Recovering the Values After an EBCDIC to ASCII Character Conversion"
finns en tabell som beskriver kodningen helt OK.

Jag läser helt enkelt värderna in till Python som en textsträng och gör lite
ersättning av sista tecknet. "{" => "0", "A => "1" o.s.v. Sedan ska det in
till en SQL INSERT till en vanlig databas, och där kan man skriva texten
till en numerisk kollumn, bara tolkningen numeriskt är korrekt.

Då kan packadministratörerna få sina web-bild för analys och sortering av
packorderläget... :-)
Skriv svar