sgnauz Inserito: 30 aprile 2004 Segnala Share Inserito: 30 aprile 2004 una macchina operatrice crea un file di report nel formato seguente:Order{ order_no 96-11331_55 part_code B01698FE quant_debi 10 target_date 30/08/1998 mc_code ST002 rec_code 0 user 12870,John Smith,Robin Hood} Order{ order_no 96-11383_1 part_code 4-03314 quant_debi 25 target_date 27/09/1998 mc_code ST002 rec_code 0 user 107999} Order{ order_no 96-11383_102 part_code 3-01375 quant_debi 5 target_date 27/09/1998 mc_code ST002 rec_code 0 user qualcuno conosce un buon sistema per convertire questo formato in un file standard CSV? Link al commento Condividi su altri siti More sharing options...
Colombani Inserita: 30 aprile 2004 Segnala Share Inserita: 30 aprile 2004 CVS sta per "Comma Separated Value" ...dunque è arbitrario, intendo dire la scelta di un criterio di conversione. Forse intendevi dire se qualcuno conosce una convenzione standard? Link al commento Condividi su altri siti More sharing options...
nll Inserita: 30 aprile 2004 Segnala Share Inserita: 30 aprile 2004 Non dovrebbe essere troppo difficile, caricando riga per riga ed analizzandone il contenuto, ma dovresti chiarire alcuni punti:Il Tag "Order{...}" costituisce il separatore di record, che tradotto in CSV possiamo trasformarlo in un CrLf (Ritorno a capo + Nuova linea): ti va bene?Ti serve che la prima riga riporti anche il nome dei campi, oppure vanno omessi?Quali sono i campi che prevedono risposte multiple? (ne ho individuato uno: "user" = 12870,John Smith,Robin Hood)E come intendi registrare le risposte multiple?(nell'esempio,"user 12870" può esaurire l'informazione? oppure"user 12870", "user John Smith", user Robin Hood" oppure"user 12870" => "12870 John Smith" => "12870 Robin Hood" oppure suggerisci tu la tua esigenza)Ovviamente ho riscritto i nomi dei campi per chiarezza, ma nel file che ne uscirà i campi saranno riportati in sequenza, senza citarne il nome (se non nella prima riga) ed ogni record riporterà TUTTI i campi, compresi quelli che risultano nulli.Qualunque linguaggio di programmazione potrebbe operare sul tuo file e mandare in output un file Comma Separated Value (CSV), se ho interpretato bene la tua esigenza, senza la necessità di conoscere preventivamente il nome dei campi (se è perfettamente rappresentativo l'esempio che ci hai fornito), perché il primo carattere blank può servire da separatore tra il nome del campo e il valore ad esso assegnato. Link al commento Condividi su altri siti More sharing options...
dago_ Inserita: 30 aprile 2004 Segnala Share Inserita: 30 aprile 2004 Esempio molto spartano, non tiene conto di eventuali errori tipo file gia' aperto da altre applicazioni, da per scontata la lunghezza e la posizione dei dati,ad esempio nel tuo allegato l'ultima registrazione e' composta da8 righe e non 9 come previsto nell'esempio.In questo caso l'ultima registrazione non viene salvata.In ogni caso attendi fiducioso altri suggerimenti piu' professionali.Dim strNomeFileDati As StringDim strNomeFileCsv As StringDim intNumFileDati As IntegerDim intNumFileCSV As IntegerDim strRiga As StringDim strRecord As StringDim intCounter As IntegerstrNomeFileDati = App.Path + "\" + "dati.txt"intNumFileDati = FreeFileOpen strNomeFileDati For Input As intNumFileDatistrNomeFileCsv = App.Path + "\" + "dati.csv"intNumFileCSV = FreeFileOpen strNomeFileCsv For Output As intNumFileCSVintCounter = 0Do While Not EOF(intNumFileDati) 'cerca fino alla fine del file Line Input #intNumFileDati, strRiga 'legge la riga di dati intCounter = intCounter + 1 If intCounter > 9 Then intCounter = 1: Print #intNumFileCSV, strRecord Select Case intCounter Case 1 ' Case 2 strRecord = Trim(Mid$(strRiga, 9, Len(strRiga) - 8)) + ";" Case 3 strRecord = strRecord + Trim(Mid$(strRiga, 10, Len(strRiga) - 9)) + ";" Case 4 strRecord = strRecord + Trim(Mid$(strRiga, 11, Len(strRiga) - 10)) + ";" Case 5 strRecord = strRecord + Trim(Mid$(strRiga, 12, Len(strRiga) - 11)) + ";" Case 6 strRecord = strRecord + Trim(Mid$(strRiga, 8, Len(strRiga) - 7)) + ";" Case 7 strRecord = strRecord + Trim(Mid$(strRiga, 9, Len(strRiga) - 8)) + ";" Case 8 strRecord = strRecord + Trim(Mid$(strRiga, 5, Len(strRiga) - 4)) + ";" Case 9 ' End SelectLoopClose Link al commento Condividi su altri siti More sharing options...
nll Inserita: 30 aprile 2004 Segnala Share Inserita: 30 aprile 2004 Dago, l'ultimo record ha una riga in meno probabilmente perché nel copy & paste non è stata copiata l'ultima parentesi graffa chiusa, ma è chiaro che è solo un refuso.Il tuo programmino va bene solo per il caso specifico, io sono sempre orientato nel creare programmi che funzionano nel maggior numero di casi possibile, per quello avrei optato per il riconoscimento [ InStr(...) ] del carattere blank (la sua assenza significa che la linea contiene l'apertura "Order{", la chiusura "}", o un nome di campo senza un valore associato, e quindi avrei gestito la casistica, in tutti gli altri casi lo stesso codice mi funziona con qualunque nome di campo, anche nel caso mi venisse la necessità di analizzare un file con un numero di campi differente, o con un differente numero di caratteri per ciascun nome campo).Verificare l'esistenza del file in ingresso non è un problema, in quanto potresti utilizzare gli oggetti di windows (Explorer) per selezionare un file esistente e potresti verificare l'esistenza, o meno, del file di output, per evitare di sovraschiverne uno involontariamente, utilizzando Variabile = Dir$(nomeFile) e verificando che Variabile non sia una stringa nulla. Comunque è un buono spunto per partire a tirar giù del codice sensato, poi con un po' di debugging si aggiustano le imperfezioni. Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora