» »

[C#] branje ter urejanje podatkov

[C#] branje ter urejanje podatkov

maticm ::

V C# bi rad napisal program, ki bi prebral podatke iz nekega txt filea nato pa bi te podatke uporabil naprej.
Recimo: tole je moja txt datoteka!
8300 in 8304 sta registra
8300 je pisalni oz to je naslov
8304 pa vrne naslov naprave če je prisotna, če ni pa je ffffff

_DATA p:e0008300
00 00 00 80
_END 0

_DATA p:e0008304
57 19 90 00
_END 0

_DATA p:e0008300
00 58 00 80
_END 0

_DATA p:e0008304
ff ff ff ff
_END 0
  • spremenilo: snow ()

salesky ::

Kaj bi rad naredu?

maticm ::

Na kratko:

Rad bi:
-00000080 - mi pove številko naprave (mal pomešani biti) in moram izpisati
-57 19 90 00 - tole cifro pa moram izpisat

Vse dobim v txt fileu.
Če pa je cifra ff ff ff ff za številko naprave pa naj ne izpiše ničesar

Kako naj definiram ff ff ff ff v C# kot spremenljivko??

Zgodovina sprememb…

  • spremenil: maticm ()

salesky ::

Ja lahko jo definiraš kot string?

Drugače pa napišeš program, kjer odpreš file in greš skoz celotno datoteko in poiščeš za vsako vrstico vrednost ki jo iščeš.

LP

maticm ::

Kaj delam narobe, da mi vedno izpiše samo prvo napravo?
aja vrstic je 178
evo moj file:

_DATA p:e0008300
00 00 00 80
_DATA p:e0008304
57 19 90 00
_END 0

_DATA p:e0008300
00 58 00 80
_DATA p:e0008304
ff ff ff ff
_END 0

_DATA p:e0008300
00 60 00 80
_DATA p:e0008304
ff ff ff ff
_END 0

_DATA p:e0008300
00 68 00 80
_DATA p:e0008304
33 56 55 88
_END 0


.
.
.
in koda:
static void Main(string[] args)
{
//Load our text file
TextReader tr = new StreamReader("d:\\savefile.txt");

//How many lines should be loaded?
int NumberOfLines = 180;

//Make our array for each line - polje veliko za vsako vrstico
string[] ListLines = new string[NumberOfLines];

//Read the number of lines and put them in the array
for (int i = 1; i < NumberOfLines; i++)
{
ListLines[i] = tr.ReadLine();
}


//definicija spremenljivke ni= ff ff ff ff
string ni = " ff ff ff ff";
int x=5;
int y=3;

start:
if (ListLines[x]== ni)
{
x++;
x++;
x++;
x++;
x++;
x++;
y++;
y++;
y++;
y++;
y++;
y++;
}
else
{
Console.WriteLine(ListLines[y]);
x++;
x++;
x++;
x++;
x++;
x++;
y++;
y++;
y++;
y++;
y++;
y++;
}

Console.ReadLine();

// close the stream
tr.Close();

goto start;
}
private void Form1_Load(object sender, System.EventArgs e)
{

}
}
}

PaX_MaN ::

Nekej v tem stillu:
1. če se vrstica konča s e0008300, izpiši naslednjo vrstico, nato preskoči 1 vrstico in izpiši naslednjo vrstico, pojdi na naslednjo vrstico,
2. če se ne konča s e0008300, pojdi v naslednjo vrstico

Je to to?

Zgodovina sprememb…

  • spremenilo: PaX_MaN ()

maticm ::

Če je vrstica ff ff ff ne izpiše ničesar, če pa je namesto ff karkoli druzga pa ispiše dve vrstici nad tem drugim (ki naj bi pisalo namesto ff ff ff ff)
recimo:
v prvem podatku je namesto ff ff ff ff : 57 19 90 00
izpisat moram pa 00 00 00 80

_DATA p:e0008300
00 00 00 80
_DATA p:e0008304
57 19 90 00
_END 0

_DATA p:e0008300
00 58 00 80
_DATA p:e0008304
ff ff ff ff
_END 0

_DATA p:e0008300
00 60 00 80
_DATA p:e0008304
ff ff ff ff
_END 0

_DATA p:e0008300
00 68 00 80
_DATA p:e0008304
33 56 55 88
_END 0

Zgodovina sprememb…

  • spremenil: maticm ()

PaX_MaN ::

Aha, tako.

Zgodovina sprememb…

  • spremenilo: PaX_MaN ()

PaX_MaN ::

Jah, lahko bi dal nekej tacga:

- prebereš vse vrstice v seznam
- greš skozi vsako 4. vrstico ( 4 * i, i -> n) v seznamu, dokler nisi na koncu seznama
- jo preveriš, če je enaka "ff ff ff ff":
- če je, greš na naslednjo 4. vrstico ( 4 * (i +1))
- sicer izpišeš (4 * i -2) vrstico

Zgodovina sprememb…

  • spremenilo: PaX_MaN ()

maticm ::

še nekaj sem ugotovil!
Kaj če jaz spremenim file po tem ko skompajlam. Ali se bodo spremembe upštevale v samem postopku ali ne?

Jaz želim, da se!

PaX_MaN ::

Če se datoteka s podatki spremeni, jo boš moral še enkrat prebrati in sparsat.
Namreč, ko je datoteka v uporabi ( tukaj z NekimStreamReaderjem), naredi lock na to datoteko, zato jo ne moreš spreminjati, dokler ne zapreš streama ( tu tr.close()).
Lahko narediš eno metodo, ki ti periodično parsa ta fajl, pač glede na npr. velikost, datum zadnje spremembe datoteke.

maticm ::

kako naj pa odrežem podatek:
00 58 00 80

rabil bi samo 58 in pretvoril v decimalno tako da bi dobil 11.

5 8
|0101|1000

če pogledaš samo prvih 5 bitov (L->D) je to cifra 11 v decimalni

Lahko kdo pripne kakšen link (na PM) za kakšen dober book.

Zgodovina sprememb…

  • spremenil: maticm ()

Tr0n ::

Preberes kot String in potem z njim delas, kar ti pase. Poglej String C# dokumentacijo.

PaX_MaN ::

Zihr maš nekje razred/struct/library za manipulacijo s stringi.
Vzameš obe cifri posebej, ie (string zato, da lahko potem pretvoriš v binarno in vzameš črke vuni):

String sub = "00 58 00 80".characterAt(3);
String sub1 = "00 58 00 80".characterAt(4);

Potem imaš pa tudi nekje funkcijo toBinary(), če nadaljuješ, pretvoriš prvega in drugega v binarno:
sub = sub.toBinary().toString();
sub1 = sub1.toBinary().toString();

Nato pa od drugega samo vzameš prvo črko (1 ali 0) in jo dodaš prvi:
sub = sub + sub1.characterAt(0);

Potem pa samo še pretvoriš nazaj v desetiško:
String final = sub.binaryToDecimal();

Tole je malo sfaljeno, ker ne poznam funkcij iz C#. Malo poguglaj ali pa RTMjaj.

maticm ::

lih kar bom pop****

Dam
char k = number [4];
char l = number [5];
dobim znaka od stringa v k in l

zdej pa skonvertirat v bin? Kaj delam narobe?

int value = Convert.ToInt32("k",10);
Console.WriteLine(value);
string bin = Convert.ToString(value,2);
Console.WriteLine(bin);

maticm ::

če pa napišem tole:
int value = Convert.ToInt32(k);
Console.WriteLine(value);
string bin = Convert.ToString(value, 2);
Console.WriteLine(bin);

mi vrže ven decimalno kodo od znaka 0 torej 48.
Se pravi bi mogu najprej skonvertirat v decimalno cifro in nato uporabit tole - se motim?

PaX_MaN ::

Tukaj je nekaj o pretvorbi v različne formate.

maticm ::

Sicer mi stvar dela ampak mi ni jasno od kod dobi še dva bita zadaj? skonvertiral je 00 in d8
0
0
110100 (dva bita)
1000

program:
int value = Convert.ToInt16(k); // konvertiramo v intiger
//Console.WriteLine(value);
int decimalna = value - 48; //odštejemo 48 (od ascii kode za 0), da dobimo dejansko decimalno vrednost, ki jo želimo pretvoriti
string bin = Convert.ToString(decimalna, 2); //konvertiramo v binarno vrednost
Console.WriteLine(bin);

maticm ::

Kako naj zahtevam da bo pretvorjena BINARNA vrednost vedno 4 bitna?
Recimo, da pretvorim:
6 => 0110
8=> 1000

string binl = Convert.ToString(kodal, 2);

funkcija vrača 6=>110


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C# pomoč

Oddelek: Programiranje
111206 (848) mihies
»

[c#] Majhen problemček

Oddelek: Programiranje
10916 (724) darkolord
»

[C#] Operacija IN in ALI med dvema int številoma

Oddelek: Programiranje
111088 (901) LeQuack
»

C# (strani: 1 2 )

Oddelek: Programiranje
9711454 (8289) Ericssony
»

Pomoč pri programčkih

Oddelek: Programiranje
152736 (2386) Mitja Bonča

Več podobnih tem