2015-05-29 3 views
1

мне нужна помощь, у меня есть текстовый файл, как показано ниже:Split файл .txt для заполнения Datatable C#

Jhonathan Car 17000 
Tony  Bike 4000 
Mika  Home 20000 

тогда я хочу загрузить этот файл .txt в DataTable с расколом (»«), я делаю создать подобный код ниже

DataTable dt = new DataTable(); 
dt.Columns.Add("COL1"); dt.Columns.Add("COL2"); dt.Columns.Add("COL3"); 
string[] aa = File.ReadAllLines(txtFileName); 
     foreach (var item in aa) 
    { 
     DataRow dr = dt.NewRow(); 
     dr[0] = item.ToString(); 
     dt.Rows.Add(dr); 
    } 
    dataGridView3.DataSource = dt; 

}

и я надеюсь, что результат был, как показано ниже: Истинную результат:

COL1  | COL2 | COL3 
----------------------------  
Jhonathan | Car |17000 
Tony  | Bike |4000 
Mika  | Home |20000 

, но результат от моего кода, как ожидалось, и результат был, как показано ниже: Failed Результат:

COL1     | COL2 | COL3 
-------------------------------------------  
Jhonathan Car 17000 |   | 
Tony  Bike 4000 |   | 
Mika  Home 20000 |   | 

так, как разделить на результат, как истинный результат. Thx :-)

+1

пространство между вашими словами не может быть 'space' carácter (который находится в Unicode U +' 0020'), но, например, 'tab' carácter (который находится в Unicode U +' 0009') –

+1

Это кажется основной проблемой использования подстроки. – xanatos

+0

Если переменные пространства между столбцами могут быть проблемой: как насчет имени «Jhon Tiberius kirk Enterprise 90000» – Max

ответ

1

Я предпочел бы экстракт рутина в метод, который преобразует вид CSV (в вашем случае - файл, разделенный таблицами) в таблицу:

private static DataTable FileToTable(String fileName) { 
    DataTable result = new DataTable(); 

    foreach (var line in File.ReadLines(fileName)) { 
    DataRow row = result.NewRow(); 

    //TODO: you may want tabulation ('\t') separator as well as space 
    String[] items = line.Split(new Char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); 
    // Columns adjusting: you don't need exactly 3 columns 
    for (int i = result.Columns.Count; i < items.Length; ++i) 
     result.Columns.Add(String.Format("COL {0}", i + 1)); 

    row.ItemArray = items; 
    result.Rows.Add(row); 
    } 

    return result; 
} 

... 

dataGridView3.DataSource = FileToTable(txtFileName); 
+0

@ General-Doomer: Нет, новые столбцы добавляются * тогда и только тогда, когда * фактическое чтение данных ('items') имеет больше элементов, чем таблица (результат ') имеет столбцы. Да, образец теперь разделяется пробелами (''), но часто используется «\ t», поэтому я поставил «...вы можете захотеть ... » –

+0

Отлично, это лучший способ, Спасибо и господин Дмитрий Быченко –

4

раствора Regex

// regular expression for split row: 
Regex parser = new Regex(@"\s+"); 

// modified code (replace with your file path) 
DataTable dt = new DataTable(); 
dt.Columns.Add("COL1"); dt.Columns.Add("COL2"); dt.Columns.Add("COL3"); 
string[] lines = File.ReadAllLines(@"D:\Temp\text.txt"); 
foreach (var line in lines) 
{ 
    DataRow dr = dt.NewRow(); 
    string[] words = parser.Split(line); 
    dr[0] = words[0]; 
    dr[1] = words[1]; 
    dr[2] = words[2]; 
    dt.Rows.Add(dr); 
} 

Фиксированная строка раствора маска

// fixed length mask (number of charachers for each field except last field) 
int[] mask = { 12, 6 }; 
int maskLength = mask.Length; 

// modified code (replace with your file path) 
DataTable dt = new DataTable(); 
dt.Columns.Add("COL1"); dt.Columns.Add("COL2"); dt.Columns.Add("COL3"); 
string[] lines = File.ReadAllLines(@"D:\Temp\text.txt"); 
foreach (var line in lines) 
{ 
    DataRow dr = dt.NewRow(); 
    int pos = 0; 
    for (int i = 0; i < maskLength; pos += mask[i++]) 
    { 
     dr[i] = line.Substring(pos, mask[i]).Trim(); 
    } 
    dr[maskLength] = line.Substring(pos).Trim(); 
    dt.Rows.Add(dr); 
} 
+2

Я думаю, что это плохая идея. Его формат кажется «фиксированной длиной». Вместо этого вы используете CSV где запятая - это пространство. Что произойдет, если есть «Mac Arthur», у которого есть велосипед? – xanatos

+0

@ General-Doomer просто положил это в цикл 'for', и все довольны –

+0

Вы раскалываетесь в пустое пространство вместо вкладок. имя содержит пробел, а ваш код разрывается. – TaW

Смежные вопросы