|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2003
Messaggi: 322
|
Grattacapo.............
Ciao a tutti,
ho un problema che spero di poter risolvere con il vostro aiuto. In files di testo di notevoli dimensioni (fino a 1 GB) devo sostituire la stringa " 287D " con la stringa " 212D " e la stringa " 287D-" con la stringa " 212D-"... Detto così potrebbe essere semplice, ma: 1.i files da trattare hanno una strana formattazione (a capo ogni 81 caratteri) che deve essere per cui capita che le stringhe da sostituire siano spezzate: questo complica notevolmente le coseperchè se le stringhe originali sono uniche, i pezzi in cui vengono divise non lo sono. Operando le varie sostituzioni (per tutte le suddivisioni possibili) si sostituiscono parti di testo che non devono essere sostituite (per es. " 28" ricorrecentinaia di volte in un file di quelle dimensioni) 2.ho provato con vari elaboratori di testo (come textpad), ma le dimensioni dei files da trattare sono proibitive... 3.insieme a un amico che conosce Matlab abbiamo realizzato un programmino che: -mette in riga il file; -fa le sostituzioni (facendo un confronti carattere per carattere); -rimette in colonna il file; questo programma funziona, ma è lentissimo... Il mio amico mi ha detto che un programma in C sarebbe immensamente più veloce... solo che non so assolutamente da che parte cominciare... Probabilmente per qualcuno di voi sarà un quesito sciocco, ma io non so che pesci pigliare, tra librerie e sintassi. Grazie a tutti michele |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Jan 2001
Messaggi: 1976
|
mooolto semplice:
10 righe. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2003
Messaggi: 322
|
Sono io un po' tardo o sei tu un pochino criptico
|
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Jan 2001
Messaggi: 1976
|
prrrooooova
P.S. non è colpa tua: con matlab tutto è tardo ! |
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Jan 2001
Messaggi: 1976
|
mandare 20 kB del file mostro please
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2003
Messaggi: 322
|
Eccoli...
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2003
Messaggi: 322
|
si tratta di un pezzo di uno dei file che devo tradurre...
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Mar 2002
Città: Italy/Usa
Messaggi: 2817
|
Re: Grattacapo.............
Quote:
__________________
"Utilizzando atomi pentavalenti drogheremo il silicio di tipo n; Utilizzando atomi trivalenti drogheremo il silicio di tipo p; Utilizzando della cannabis ci drogheremo noi e vedremo il silicio fare cose impossibili" - DSDT-HowTo |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Codice:
#include <stdio.h>
#define TEXT1 " 287D "
#define SUBTEXT1 " 212D "
#define TEXT1 " 287D-"
#define SUBTEXT1 " 212D-"
#define LEN 6
#define FILENAME "pippo.txt"
void scala_buf(char *buf)
{
int i;
for(i = 1; i < LEN+1; ++i)
buf[i-1] = buf[i];
}
int confronta(char *buf, char *text)
{
int i;
for(i = 0; i < LEN; ++i)
if(buf[i] != text[i])
return 0;
return 1;
}
int main()
{
char buf[LEN+1]
int i, ret;
FILE *f;
f = fopen(FILENAME, "r+t");
ret = fread(buf, LEN, 1, f);
while(ret >0)
{
if(confronta(buf, TEXT1))
{
fseek(-LEN, SEEK_CUR, f);
fwrite(SUBTEXT1, LEN, 1, fp);
}
if(confronta(buf, TEXT2))
{
fseek(-LEN, SEEK_CUR, f);
fwrite(SUBTEXT2, LEN, 1, fp);
}
do {
ret = fread(&buf[LEN], 1, 1, f);
} while(buf[LEN] == '\n' & ret > 0)
scala_buf(buf);
}
fclose(f)
return 0;
}
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jul 2000
Città: Amsterdam
Messaggi: 217
|
Riposto la versione che compila con -Wall e -Werror:
Codice:
#include <stdio.h>
#define TEXT1 " 287D "
#define SUBTEXT1 " 212D "
#define TEXT2 " 287D-"
#define SUBTEXT2 " 212D-"
#define LEN 6
#define FILENAME "pippo.txt"
void scala_buf(char *buf) {
int i;
for(i = 1; i < LEN+1; ++i)
buf[i-1] = buf[i];
}
int confronta(char *buf, char *text) {
int i;
for(i = 0; i < LEN; ++i) {
if(buf[i] != text[i])
return 0;
}
return 1;
}
int main() {
char buf[LEN+1];
int ret;
FILE *f;
f = fopen(FILENAME, "r+t");
ret = fread(buf, LEN, 1, f);
while(ret > 0) {
if(confronta(buf, TEXT1)) {
fseek(f, -LEN, SEEK_CUR);
fwrite(SUBTEXT1, LEN, 1, f);
}
if(confronta(buf, TEXT2)) {
fseek(f, -LEN, SEEK_CUR);
fwrite(SUBTEXT2, LEN, 1, f);
}
do {
ret = fread(&buf[LEN], 1, 1, f);
} while(buf[LEN] == '\n' && ret > 0);
scala_buf(buf);
}
fclose(f);
return 0;
}
Ultima modifica di Dun : 08-08-2004 alle 19:52. |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2003
Messaggi: 322
|
grazie mille ragazzi,
appena mi sarà possibile partirò con le traduzioni e vi saprò dire se tutto funziona. I files che devo tradurre, per soddisfare la curiosità di qualcuno, sono files di risultati di ABAQUS (simulazione strutturale). La traduzione è necessaria affinchè tali risultati siano leggibili da PATRAN (visualizzatore) (sotto mentite spoglie, scambiando una etichetta che non legge con una etichetta che legge!). Per questo motivo i files di testo sono enormi! mk |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2003
Messaggi: 322
|
Purtroppo non so cosa siano -Wall e -Werr
Comunque ho compliato e lanciato il programma postato da Dun su un piccolo file di esempio e non succede nulla Il file di partenza è immutato |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jul 2000
Città: Amsterdam
Messaggi: 217
|
Hai cambiato vero nel define pippo.txt col tuo file?
E cmq non mi era chiara una cosa: nel tuo primo post la stringa da trovare era composta da " 287D " che cionci ha interpretato con "spazio287Dspazio". Confermi? |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jul 2000
Città: Amsterdam
Messaggi: 217
|
Sotto che OS sei?
Sarebbe curioso provare ad utilizzare sed.... |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jul 2000
Città: Amsterdam
Messaggi: 217
|
In effeti non funziona
appena finito di studiare ci do n okkiata |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Jul 2000
Città: Amsterdam
Messaggi: 217
|
Anche se a prima occhiata sembra non considerare lo spazio iniziale e il trattino, dovrebbe funzionare perfettamente.
Codice:
#include <stdio.h>
#define TEXT1 "287D"
#define SUBTEXT1 "212D"
#define FILENAME "pippo.txt"
int confronta(FILE *f, int *j, char *text) {
int i;
char buf[1];
(*j) = 0;
for(i = 1; i < 4; i++) {
fread(buf, 1, 1, f);
(*j)++;
if(buf[0] == '\n') {
fread(buf, 1, 1, f);
(*j)++;
}
if(buf[0] != text[i]) {
return 0;
}
}
return 1;
}
void subst(FILE *f, int cchar, char text[5]) {
char buf[1];
int i = 0;
fseek(f, -(cchar+1), SEEK_CUR);
for (i = 0; i < cchar; i++) {
fread(buf, 1, 1, f);
if(buf[0] == '\n') {
fseek(f, -1, SEEK_CUR);
fwrite("\n", 1, 1, f);
}
else {
fseek(f, -1, SEEK_CUR);
}
fwrite(&text[i], 1, 1, f);
}
}
int main() {
char buf[1], bak[1];
int ret;
FILE *f;
f = fopen(FILENAME, "r+t");
ret = fread(buf, 1, 1, f);
bak[0] = '\0';
while(ret > 0) {
if (buf[0] == '2' && bak[0] == ' ') {
if(confronta(f, &ret, TEXT1) == 1) {
subst(f, ret, SUBTEXT1);
}
}
bak[0] = buf[0];
ret = fread(buf, 1, 1, f);
if(ret != 1) {
printf("\nEND OF FILE\n");
}
}
fclose(f);
return 0;
}
Ultima modifica di Dun : 08-08-2004 alle 20:11. |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Jul 2000
Città: Amsterdam
Messaggi: 217
|
[doppio post]
Ultima modifica di Dun : 08-08-2004 alle 20:08. |
|
|
|
|
|
#18 |
|
Bannato
Iscritto dal: Jan 2001
Messaggi: 1976
|
file da 1 gigabyte elaborato (2 sostituzioni) in 6.3 secondi ! e 10 righe di codice |
|
|
|
|
|
#19 |
|
Bannato
Iscritto dal: Jan 2001
Messaggi: 1976
|
interessa ?
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Apr 2003
Messaggi: 322
|
Grazie Dun.
Con sed e altri comandi tipo unix avevo già provato...è una soluzione veloce, ma applicabile solo per files fino a qualche mega Sono sotto Win. Le stringhe da sostituire hanno spazio a inizio e fine (spazio287Dspazio)o spazio a inizio e trattino alla fine (spazio287Dtrattino):questo è fondamentale! Ma ricordo che il casino è che le stringhe da sostituire vengono telvolta spezzate (se si è alla fine degli 81 caratteri della riga) Per a2000 Funziona davvero alla grande il tuo programmino se fa tutto e bene in 6.3 sec Quando Matlab ci impiega circa 4/5 ore mk |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:47.


















