Vai al contenuto
PLC Forum


File Csv


sgnauz

Messaggi consigliati

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


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

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

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 da

8 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 String

Dim strNomeFileCsv As String

Dim intNumFileDati As Integer

Dim intNumFileCSV As Integer

Dim strRiga As String

Dim strRecord As String

Dim intCounter As Integer

strNomeFileDati = App.Path + "\" + "dati.txt"

intNumFileDati = FreeFile

Open strNomeFileDati For Input As intNumFileDati

strNomeFileCsv = App.Path + "\" + "dati.csv"

intNumFileCSV = FreeFile

Open strNomeFileCsv For Output As intNumFileCSV

intCounter = 0

Do 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 Select

Loop

Close

Link al commento
Condividi su altri siti

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

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...