View Full Version : [C#] Split di una stringa e generazione DataTable
robertino_salemi
17-03-2015, 08:45
Buongiorno,
ho necessità di eseguire un split di una string e da questa generare un Datatable.
La stringa in mio possesso è del tipo:
'B1M3T2' oppure potrebbe essere B10M3T22'
dove l'ordine non è sempre lo stesso, e bisogna leggerle sempre in coppia:
B1 - M2 - T2
Dopo lo split dovrei generare un DataTable:
CHAR-----INT
B--------1
M--------2
T--------2
Per lo split stavo utilizzando come separatore un array di char, ma non ho controllo sull'ordine...
Suggerimenti?
Grazie.
[Kendall]
17-03-2015, 09:24
Buongiorno,
ho necessità di eseguire un split di una string e da questa generare un Datatable.
La stringa in mio possesso è del tipo:
'B1M3T2' oppure potrebbe essere B10M3T22'
dove l'ordine non è sempre lo stesso, e bisogna leggerle sempre in coppia:
B1 - M2 - T2
Dopo lo split dovrei generare un DataTable:
CHAR-----INT
B--------1
M--------2
T--------2
Per lo split stavo utilizzando come separatore un array di char, ma non ho controllo sull'ordine...
Suggerimenti?
Grazie.
Uno degli strumenti più potenti da questo punto di vista sono le regular expression.
Dai un'occhiata qui (https://msdn.microsoft.com/en-us/library/az24scfc%28v=vs.110%29.aspx).
tomminno
17-03-2015, 09:25
Non mi è chiaro il formato dei dati che devi interpretare.
Dici che vanno letti in coppia, ma nel secondo esempio riporti la stringa 'B10M3T22' e lo 0 tra B1 e M3 che fine fa?
Devi leggere solo il primo numero dopo una lettera?
robertino_salemi
17-03-2015, 09:32
[Kendall]:
si, nel mio caso dovrebbe essere (o forse è molto semplice), no?
Come dovrei trattarla?
[B]tomminno
con la stringa 'B1M3T2' ottengo:
CHAR-----INT
B--------1
M--------2
T--------2
con la stringa 'B10M3T22' ottengo:
CHAR-----INT
B--------10
M--------3
T--------22
robertino_salemi
18-03-2015, 10:08
Risolto grazie al supporto di un altro utente:
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("CHAR", typeof(string)));
dt.Columns.Add(new DataColumn("INT", typeof(int)));
string s = "B10M3T22";
int lastIndex = 0;
bool isDigit = false;
for (int i = 0; i < s.Length; ++i)
{
if (char.IsDigit(s[i]))
{
if (!isDigit)
{
string column = s.Substring(lastIndex, i - lastIndex);
dt.Rows.Add(column, Convert.ToInt32(s[i].ToString()));
}
else
{
//add digit
dt.Rows[dt.Rows.Count - 1][1] = int.Parse(dt.Rows[dt.Rows.Count - 1][1].ToString() + s[i]);
}
lastIndex = i + 1;
isDigit = true;
}
else
isDigit = false;
}
Magari può essere utile a qualcuno....
RaouL_BennetH
18-03-2015, 10:09
Puoi vedere diversi tipi di approccio al problema anche qui:
http://stackoverflow.com/questions/734937/string-parsing-extracting-numbers-and-letters
robertino_salemi
18-03-2015, 10:15
Puoi vedere diversi tipi di approccio al problema anche qui:
http://stackoverflow.com/questions/734937/string-parsing-extracting-numbers-and-letters
Esatto, qui (http://stackoverflow.com/a/734976/4684711) c'è una parte simile a quella da me postata.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.