oto co napisalem:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
int main()
{
char
pierwsza_linia[100]="<TICKER>,<DTYYYYMMDD>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>\n";
char linia_we[200];
char linia_wy[200];
FILE *plik_we =0;
FILE *plik_wy =0;
plik_we=fopen("W20PLN1440.csv","r");
plik_wy=fopen("W20PLN.csv","w");
char znak;
if ( plik_we == 0 )
{ printf("Nie mozna otworzyc pliku wejsciowego"); exit(0); }
else
{
fputs( pierwsza_linia, plik_wy);
while( !feof( plik_we ) )
{
char przedrostek[800]="W20PLN,";
fgets( linia_we, 1024, plik_we );
fputs( strcat(przedrostek , linia_we), plik_wy );
}
};
fclose(plik_we);
fclose(plik_wy);
return 0;
}
plik we:
2005.08.26,00:00,2175,2191,2175,2186,22
2005.08.29,00:00,2170,2210,2170,2210,41
2005.08.30,00:00,2220,2240,2219,2235,28
2005.08.31,00:00,2237,2249,2229,2233,37
2005.09.01,00:00,2239,2287,2238,2278,60
2005.09.02,00:00,2280,2306,2268,2275,72
2005.09.05,00:00,2276,2285,2269,2269,26
2005.09.06,00:00,2269,2284,2267,2284,20
2005.09.07,00:00,2294,2308,2271,2272,53
2005.09.08,00:00,2279,2287,2272,2275,27
porzadany plik wy:
<TICKER>,<DTYYYYMMDD>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>
W20PLN,20050826,2175,2191,2175,2186,22
W20PLN,20050829,2170,2210,2170,2210,41
W20PLN,20050830,2220,2240,2219,2235,28
W20PLN,20050831,2237,2249,2229,2233,37
W20PLN,20050901,2239,2287,2238,2278,60
W20PLN,20050902,2280,2306,2268,2275,72
W20PLN,20050905,2276,2285,2269,2269,26
W20PLN,20050906,2269,2284,2267,2284,20
W20PLN,20050907,2294,2308,2271,2272,53
potrzebuje zamienic z linii wejsciowej ",00:00," i zamienic na ","
oraz usunac wszystkie kropki w dacie.
program dodakowo powtarza mi dwukrotnie ostatnia linijke - nnie wiem
jeszcze dlaczego ani jak to ominac. ale w porownaniu ze sciana z jaka
sie zderzylem wydaje sie to byc banalem.
w oraclowych formsach pracy na godzine wtym parzenie kawy:), ale nie mam
miejsca na dysku aby baze postawic.
Artur
> Czesc.
> po 19 latach przerwy przyszlo mi wrocic do ansi c.
> pamietalem ze nie jest latwy jezyk - majacy mnostwo ograniczen, ktore
> mozna ominac majac troche wprawy, ale jak napisalem po 19 latach przerwy
> o wprawie trodno mowic.
> potrzebuje skrobnac sobie programik ktory wczytuje dane z textowego
> pliku wejsciowego, modyfikuje je i tworzy plik wyjsciowy.
A to koniecznie w C musi być? W takim pythonie czy awku to kilka wierszy kodu.
> plik we:
> 2005.08.26,00:00,2175,2191,2175,2186,22
> [...]
>
> porzadany plik wy:
>
> <TICKER>,<DTYYYYMMDD>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>
> W20PLN,20050826,2175,2191,2175,2186,22
> [...]
>
> potrzebuje zamienic z linii wejsciowej ",00:00," i zamienic na ","
> oraz usunac wszystkie kropki w dacie.
> program dodakowo powtarza mi dwukrotnie ostatnia linijke - nnie wiem
> jeszcze dlaczego ani jak to ominac. ale w porownaniu ze sciana z jaka
> sie zderzylem wydaje sie to byc banalem.
Jeśli wiersze pliku wejściowego są zawsze takie same i masz tylko
wypisywać zmienione dane do innego pliku, to najprościej tak:
void print_string(FILE* plik, char* s, int n) {
if (n > 0) // wypisanie n pierwszych znaków
while (*s && n-- > 0)
fputc(*s++, plik);
else // albo całego łańcucha
fputs(s, plik);
}
int main() {
// ...
while (...) {
print_string(plik_wy, przedrostek, 0); // skopiowanie przedrostka
print_string(plik_wy, linia_we, 4); // 4 cyfr roku
print_string(plik_wy, linia_we + 5, 2); // 2 miesiaca
print_string(plik_wy, linia_we + 8, 2); // 2 dnia
print_string(plik_wy, linia_we + 15, 0); // i całej reszty za polem godziny
}
// ...
}
w.
> A to koniecznie w C musi byďż˝? W takim pythonie czy awku to kilka wierszy kodu.
tak slyszalem o pythonie, ale nie interesowalem sie tym, glownie z braku
czasu i checi. widac warto zapoznac sie z nim. dzieki za wskazowke i
wielkie dzieki za pomoc.
Artur
Po co aż C zaciągać do tego ? :]
(1)>$cat p.txt| perl -le 'print
"<TICKER>,<DTYYYYMMDD>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>"; while(<>)
{chop; s/\.|\://g; s/0000,//; print "W20PLN,$_"; }'
<TICKER>,<DTYYYYMMDD>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>
W20PLN,20050826,2175,2191,2175,2186,22
W20PLN,20050829,2170,2210,2170,2210,41
W20PLN,20050830,2220,2240,2219,2235,28
W20PLN,20050831,2237,2249,2229,2233,37
[...]
python jest mało fajny do obrabiania takich plików, raczej perl był do
tego stworzony i tez w nim można to trzasnąć w 1 linijce.
pozdrawiam
Paweł Socha
pozdrawiam
artur
merlin pisze:
> On 27 Gru, 20:44, plarturas <plartu...@gazeta.pl> wrote:
>> porzadany plik wy:
>>
>> <TICKER>,<DTYYYYMMDD>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>
>> W20PLN,20050826,2175,2191,2175,2186,22
>
> Po co a� C zaci�ga� do tego ? :]
> (1)>$cat p.txt| perl -le 'print
> "<TICKER>,<DTYYYYMMDD>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>"; while(<>)
> {chop; s/\.|\://g; s/0000,//; print "W20PLN,$_"; }'
> <TICKER>,<DTYYYYMMDD>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>
> W20PLN,20050826,2175,2191,2175,2186,22
> W20PLN,20050829,2170,2210,2170,2210,41
> W20PLN,20050830,2220,2240,2219,2235,28
> W20PLN,20050831,2237,2249,2229,2233,37
> [...]
>
> python jest ma�o fajny do obrabiania takich plik�w, raczej perl by� do
> tego stworzony i tez w nim mo�na to trzasn�� w 1 linijce.
>
> pozdrawiam
> Paweďż˝ Socha
> porzadany plik wy:
>
> W20PLN,20050826,2175,2191,2175,2186,22
> potrzebuje zamienic z linii wejsciowej ",00:00," i zamienic na ","
> oraz usunac wszystkie kropki w dacie.
> program dodakowo powtarza mi dwukrotnie ostatnia linijke - nnie wiem
> jeszcze dlaczego ani jak to ominac. ale w porownaniu ze sciana z jaka
> sie zderzylem wydaje sie to byc banalem.
a może coś jak to:
while (!feof(in_file)) {
int year, month, day;
int hour, minute;
int open, high, low, close, vol;
fscanf(in_file, "%d.%d.%d,%d:%d,%d,%d,%d,%d,%d",
&year, &month, &day, &hour, &minute,
&open, &high, &low, &close, &vol);
if (!feof(in_file))
fprintf(out_file, "W20PLN,%d%d%d,%d,%d,%d,%d,%d\n",
year, month, day, open, high, low, close, vol);
}
ostrzegam, że nie kompilowałem...
> Po co aż C zaciągać do tego ? :]
> (1)>$cat p.txt| perl -le 'print
> "<TICKER>,<DTYYYYMMDD>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>"; while(<>)
> {chop; s/\.|\://g; s/0000,//; print "W20PLN,$_"; }'
> [...]
>
> python jest mało fajny do obrabiania takich plików, raczej perl był do
> tego stworzony i tez w nim można to trzasnąć w 1 linijce.
W Pythonie to by było jakoś tak:
import sys
print "<TICKER>,<DTYYYYMMDD>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>"
for line in sys.stdin: # czytamy ze std wejścia
tmp = line.split(",", 2)
print "W20PLN," + tmp[0].replace(".", "") + "," + tmp[2],
Faktycznie, to nie jedna linijka, ale podjrzewam, że jednak łatwiej
przyswajalne niż Twoje /@:?$@!/$. :)
w.
> plarturas <plar...@gazeta.pl> wrote:
>
>> Czesc.
>> po 19 latach przerwy przyszlo mi wrocic do ansi c.
>> pamietalem ze nie jest latwy jezyk - majacy mnostwo ograniczen, ktore
>> mozna ominac majac troche wprawy, ale jak napisalem po 19 latach przerwy
>> o wprawie trodno mowic.
>> potrzebuje skrobnac sobie programik ktory wczytuje dane z textowego
>> pliku wejsciowego, modyfikuje je i tworzy plik wyjsciowy.
>
> A to koniecznie w C musi byďż˝? W takim pythonie czy awku to kilka wierszy
> kodu.
W C teďż˝ kilka wierszy. ;)
Ale fakt skrypciaki s� milsze w tej robocie. Cho� pewnie ja bym w og�le
pomin�� tu jakiekolwiek j�zyki programowania i zrobi� to najpierw tak:
echo '<TICKER>,<DTYYYYMMDD>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>' > pl_wy.txt
a p�niej, sam plik wej�ciowy z�upi�bym zwyk�ym sed-em:
sed "s/^/W20PLN,/;s/\.//g;s/..:..,//" pl_we.txt >> pl_wy.txt
;)
> Je�li wiersze pliku wej�ciowego s� zawsze takie same i masz tylko
> wypisywa� zmienione dane do innego pliku, to najpro�ciej tak:
>
> void print_string(FILE* plik, char* s, int n) {
> if (n > 0) // wypisanie n pierwszych znak�w
> while (*s && n-- > 0)
> fputc(*s++, plik);
> else // albo ca�ego �a�cucha
> fputs(s, plik);
> }
>
> int main() {
> // ...
> while (...) {
> print_string(plik_wy, przedrostek, 0); // skopiowanie przedrostka
> print_string(plik_wy, linia_we, 4); // 4 cyfr roku
> print_string(plik_wy, linia_we + 5, 2); // 2 miesiaca
> print_string(plik_wy, linia_we + 8, 2); // 2 dnia
> print_string(plik_wy, linia_we + 15, 0); // i ca�ej reszty za polem
> godziny }
Ten ca�y kod razem z funkcj� print_string mo�na zast�pi� przez:
#v+
while (...) {
fprintf(plik_wy, "%s", przedrostek); // skopiowanie przedrostka
fprintf(plik_wy, "%.4s", linia_we); // 4 cyfr roku
fprintf(plik_wy, "%.2s", linia_we + 5); // 2 miesi�ca
fprintf(plik_wy, "%.2s,", linia_we + 8); // 2 dnia
fprintf(plik_wy, "%s", linia_we + 17); // i ca�ej reszty
}
#v-
dodatkowo to w �rodku p�tli while nawet mo�na zast�pi� "jedn�" lini�:
#v+
fprintf(plik_wy, "%s%.4s%.2s%.2s,%s",
przedrostek, // skopiowanie przedrostka
linia_we, // 4 cyfr roku
linia_we + 5, // 2 miesi�ca
linia_we + 8, // 2 dnia
linia_we + 17 // i ca�ej reszty za polem godziny
);
#v-
;)
BTW Co do kodu autora w�tku:
char linia_we[200];
^^^
...
fgets(linia_we, 1024, plik_we );
^^^^
Lekka przesada z doborem warto�ci int-�w, bo je�li bufor (linia_we) ma 200
znak�w (po co a� tyle? - zreszt� niewa�ne), to fgets powinien czyta� nie
wi�cej ni� 199 (z miejscem na ko�cowe '\0').
Podobnie jest z:
char przedrostek[800]="W20PLN,";
Tu wystarczy�oby:
char przedrostek[8]="W20PLN,"; // 7 znak�w + \0
Ale (IMHO) lepiej jeden z dw�ch poni�szych wariant�w:
char przedrostek[] = "W20PLN,"; // lub
char *przedrostek = "W20PLN,";
Podobnie jest z tym:
pierwsza_linia[100]="<TICKER>,<DTYYYYMMDD>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>\n";
Poza tym w p�tli while trzeba inaczej sprawdza� koniec danych, bo cho�by
jedna pusta linia na ko�cu wej�cia mo�e nieco namiesza� w danych na wyj�ciu.
Ja wiem, �e mo�e si� czepiam, ale t� grup� czytaj� r�wnie� dzieci, wi�c
niech si� ucz� poprawno�ci od ma�ego, ups..., sorry, od dziecka. :)
--
Piotr Sietnik
s i e t p [@] p o c z t a [na] . o n e t . p l
> #v+
> while (...) {
> fprintf(plik_wy, "%s", przedrostek); // skopiowanie przedrostka
> fprintf(plik_wy, "%.4s", linia_we); // 4 cyfr roku
> fprintf(plik_wy, "%.2s", linia_we + 5); // 2 miesiąca
> fprintf(plik_wy, "%.2s,", linia_we + 8); // 2 dnia
> fprintf(plik_wy, "%s", linia_we + 17); // i całej reszty
> }
> #v-
Przyznam, że nie widziałem, że %s w printf może tak działać.
To jest standardowe zachowanie?
w.
> Czesc.
No cześć...
> po 19 latach przerwy przyszlo mi wrocic do ansi c. pamietalem ze nie
> jest latwy jezyk - majacy mnostwo ograniczen,
Hm... jakież to ograniczenia? Pamięciowe chyba... (nie, nie chodzi o RAM
a o Alzheimera).
> potrzebuje zamienic z linii wejsciowej ",00:00," i zamienic na "," oraz
> usunac wszystkie kropki w dacie. program dodakowo powtarza mi dwukrotnie
> ostatnia linijke - nnie wiem jeszcze dlaczego ani jak to ominac. ale w
> porownaniu ze sciana z jaka sie zderzylem wydaje sie to byc banalem.
Fakt, Egon, ściana jak cholera ;)
char *a,*b;
for (a=b=input;*input;) {
if (!strncmp(a,",00:00,",7)) {
*b++=',';
a+=7;
}
else {
*b++=*a++;
}
}
*b=0;
return input;
I dalsze reminiscencje na temat kodu (usuwanie kropek to se zrobisz).
>
> w oraclowych formsach pracy na godzine wtym parzenie kawy:), ale nie mam
> miejsca na dysku aby baze postawic.
A co ma wspólnego plsql z C? Nawet do słownika ortograficznego byś się w
tym czasie dorwał i sprawdził czy "w tym" pisze się razem czy osobno...
że o "dodakowo" już nie wspomnę.
ethanak
--
mailto=window.atob('ZXRoYW5ha0Bwb2xpcC5jb20=');
http://milena.polip.com/ - nie czekam na Ivo!
> PetruS <si...@poczta.onet.pl> wrote:
>
>> #v+
>> while (...) {
>> fprintf(plik_wy, "%s", przedrostek); // skopiowanie przedrostka
>> fprintf(plik_wy, "%.4s", linia_we); // 4 cyfr roku
>> fprintf(plik_wy, "%.2s", linia_we + 5); // 2 miesi�ca
>> fprintf(plik_wy, "%.2s,", linia_we + 8); // 2 dnia
>> fprintf(plik_wy, "%s", linia_we + 17); // i ca�ej reszty
>> }
>> #v-
>
> Przyznam, �e nie widzia�em, �e %s w printf mo�e tak dzia�a�.
> To jest standardowe zachowanie?
Tak, to jest w standardzie j�zyka. Nawet z przyk�adami u�ycia dla string�w
i wstring�w. :)
Jest to te� dobrze opisane w manach systemowych dla *niks�w. Czasem warto je
poczyta�, polecam. O tu dla przyk�adu:
http://www.digipedia.pl/man/doc/view/printf.3.html
Przed chwil� (ca�kiem przypadkowo) znalaz�em bardzo fajny opis biblioteki
standardowej C na wiki i oczywi�cie to:
http://pl.wikibooks.org/wiki/C/printf