PDA

View Full Version : [c#] Raggruppare dati e convertire file di testo


RaouL_BennetH
13-01-2017, 18:00
Premessa: non è possibile utilizzare LinQ !

Ciao a tutti.

Ho un file di testo così composto:


17,"09:00"
6,"COD04",01,0,"3000"
6,"COD08913",01,0,"3000"
6,"COD02",03,0,"2000"
16
17,"11:10"
6,"COD04",02,0,"1500"
6,"COD1921",01,0,"3000"
6,"COD70",05,0,"3000"
16

etc...


in pratica, i codici "17" e "16" indicano l'inizio e la fine del raggruppamento.
Io devo convertirli in questo modo:

09.00.0000.00.3000COD04
09.00.0000.00.3000COD08913
09.00.0000.00.2000COD02
11.10.0000.00.1500COD04
11.10.0000.00.3000COD1921
11.10.0000.00.3000COD70


Ho iniziato ragionando prima sull'aprire il file ovviamente e a cercare di individuare i campi che mi interessano:


string[] righe = File.ReadAllLines(mioFile);
foreach(string riga in righe)
{
string[] colonna = riga.Split(new char[] {','});
int head = int.Parse(colonna[0]);
switch (head)
{
case 6:
string testCodice = colonna[1].Replace("\"", "");
string testValoreCoda = colonna[4].Substring(colonna[4].Length - 6, 3);
Console.WriteLine("." + testValoreCoda + testCodice);
break;

case 16:
break;

default:
string testOrario = colonna[1].Replace("\"", "");
testOrario = testOrario.Replace(":", ".") + ".0000.00";
Console.WriteLine(testOrario);
break;
}
}


Aldilà dell'eleganza / efficienza o meno, riesco ad "isolare" i dati che mi interessano, infatti ciò che mi viene stampato a video è:


09.00.0000.00
.3000COD04
.3000COD08913
.2000COD02
11.10.0000.00
.1500COD04
.3000COD1921
.3000COD70



Potete darmi una mano sul ragionamento ?

Grazie a tutti.

U235
15-01-2017, 18:21
Ciao, non so ma ho come l'impressione che tu stia ragionando in maniera troppo "complessa".
Ogni riga del risultato la scrivi (compresa di parte iniziale) per ogni "codice" 6, e la parte iniziale cambia solo con il 17, questo dovrebbe bastarti fare lo switch solo su questi. Inoltre sai che i valori che compongono ogni riga 6 sono sempre nella stessa posizione all'interno del vettore dopo lo split (a meno che non abbia omesso qualcosa nella tua esposizione), quindi basta comporre la stringa posizionando i giusti elementi del vettore in fila, senza la necessità di fare calcoli sulla posizione dei caratteri, in fine fai un replace dei doppi apici in tutta la riga.


var head = string.Empty;
foreach(var riga in righe)
{
string[] colonna = riga.Split(new char[] {','});
switch (int.Parse(colonna[0]))
{
case 6:
Console.WriteLine((head + colonna[4] + colonna[1]).Replace("\"", ""));
break;

case 17:
head=string.Format("{0}.0000.00.",colonna[1].Replace(":", "."));
break;
}
}


Qui (http://rextester.com/UJOS58522) puoi testarlo online.

RaouL_BennetH
15-01-2017, 23:35
Grazie mille U235 !

U235
16-01-2017, 15:51
Grazie mille U235 !

Figurati :)