Ich benutze StreamReader, um auf CSV-Textdatei zuzugreifen und alle Zeilen zu einem DataTable zu lesen.IndexOutOfRange Ausnahme beim Arbeiten mit DataTable
public static DataTable ConvertToDataTable(string filePath, int numberOfColumns)
{
DataTable tbl = new DataTable();
for (int col = 0; col < numberOfColumns; col++)
tbl.Columns.Add(new DataColumn("Column" + (col + 1).ToString()));
string line;
System.IO.StreamReader file = new StreamReader("C:/ProgramData/3CX/Instance1/Data/Logs/CDRLogs/cdr.log");
while ((line = file.ReadLine()) != null)
{
var cols = line.Split(',');
DataRow dr = tbl.NewRow();
for (int cIndex = 0; cIndex < cols.Length + 1; cIndex++)
{
dr[cIndex] = cols[cIndex];
}
tbl.Rows.Add(dr);
}
Sobald ich habe alle CSV-Zeilen der Datatable hinzugefügt ich durch die Reihen zu durchlaufen wollen und remomve unerwünschte Zeilen auf Bedingungen.
DataTable dt = ConvertToDataTable("C:/ProgramData/3CX/Instance1/Data/Logs/CDRLogs", 4);
for (int i = 0; i < dt.Rows.Count; i++)
{
string duration = dt.Rows[i][1].ToString();
if (duration == "")
{
dt.Rows[i].Delete();
}
Console.WriteLine(i.ToString() + dt.Rows[i][1].ToString());
}
Das läuft ganz gut, bis ich die letzte Zeile zu erreichen, wo es scheint, durch eine Reihe zu Looping, der nicht existiert.
Jeder hat eine Idee, warum? Jede und jede Hilfe würde sehr geschätzt werden!
Wo genau haben Sie Ausnahme? Vielleicht enthält die letzte Zeile keine zweite Spalte? '' 'dt.Rows [i] [1]' '' – tym32167
Als Faustregel gilt: Löschen Sie nie ein Element einer Sammlung, die Sie iterieren. Auch bei einem Zyklus müssen Sie einige Aufmerksamkeiten (z. wie @Adimeus vorschlägt). Wenn Sie in Ihrem Code die letzte Zeile löschen, versuchen Sie in der nächsten Zeile auf Zeilen [i] zuzugreifen, die nicht mehr existieren. Auch wenn es sich nicht um die letzte Zeile handelt, bezieht sich Zeilen [i] auf die Zeile, die auf die Zeile folgt, die Sie gelöscht haben. Nicht was du auf Konsole schreiben willst, nehme ich an. –
'
pinkfloydx33