2013-09-11 7 views
7

Я пытаюсь читать из текстового файла с разделителями, но все возвращается в одной строке и в одном столбце.Чтение текстового файла с разделителями?

Мои соединения строка

OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + 
    Path.GetDirectoryName(@textBox1txtPath.Text) + ";" + 
    "Extended Properties=\"text;HDR=YES;IMEX=1;Format=Delimited(|)\""); 

И мой текстовый файл читает:

ItemNumber|ProductStatus|UPC 
0000012|closed|2525 

Пожалуйста помогите

+3

Удалённый? – user1306322

+0

Посмотрите на пакет [FileHelpers] (http://www.nuget.org/packages/FileHelpers/) nuget. Библиотека документирована [здесь] (http://www.filehelpers.com/quick_start.html). Эта библиотека делает разборчивые файлы разграниченными. –

ответ

6

я не знаю точно, что вам нужно, но вы можете сделать это :

если у вас есть string str со всем текстом в нем вы можете сделать

string[] lines = str.Split('\n');// split it to lines; 

, а затем для каждой строки вы можете сделать

string[] cells = line.Split('|');// split a line to cells 

если взять его на следующий уровень, мы можем сделать:

public class line 
{ 
    public int ItemNumber { get; set; } 
    public string ProductStatus { get; set; } 
    public int UPC { get; set; } 

    public line(string currLine) 
    { 
    string[] cells = currLine.Split('|'); 
    int item; 
    if(int.TryParse(cells[0], out item)) 
    { 
     ItemNumber = item; 
    } 

    ProductStatus = cells[1]; 

    int upc; 
    if (int.TryParse(cells[2], out upc)) 
    { 
     UPC = upc; 
    } 
    } 
} 

, а затем:

string[] lines = str.Substring(str.IndexOf("\n")).Split('\n');// split it to lines; 
List<line> tblLines = new List<line>(); 

foreach(string curr in lines) 
{ 
    tblLines.Add(new line(curr); 
} 
3

Хорошо, поэтому один вариант будет придерживаться другого подхода. Рассмотрим следующий код:

// read the entire file and store each line 
// as a new element in a string[] 
var lines = File.ReadAllLines(pathToFile); 

// we can skip the first line because it's 
// just headings - if you need the headings 
// just grab them off the 0 index 
for (int i = 1; i < lines.Length; i++) 
{ 
    var vals = lines[i].Split('|'); 

    // do something with the vals because 
    // they are now in a zero-based array 
} 

Это избавляется от этого уродства строки соединения, устраняет накладные расходы на драйвер ODBC, и резко повышает читаемость кода.

+0

Я, наконец, повернул его руку: RegistryKey myKey = Registry.LocalMachine.OpenSubKey ("ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \\ Microsoft \\ Jet \\ 4.0 \\ Двигатели \\ Текст", true); myKey.SetValue («Формат», «Ограниченный (|)», RegistryValueKind.String); – user2686400

2

Это прямо в каркасе - TextFieldParser. Не беспокойтесь о пространстве имен, это было изначально прокладкой для людей, переходящих с VB6, но это очень полезно. Вот SSCCE, который демонстрирует его использование для ряда различных разделителей:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var comma = @"one,""two, yo"",three"; 
     var tab = "one\ttwo, yo\tthee"; 
     var random = @"onelol""two, yo""lolthree"; 

     var parser = CreateParser(comma, ","); 
     Console.WriteLine("Parsing " + comma); 
     Dump(parser); 
     Console.WriteLine(); 
     parser = CreateParser(tab, "\t"); 
     Console.WriteLine("Parsing " + tab); 
     Dump(parser); 
     Console.WriteLine(); 
     parser = CreateParser(random, "lol"); 
     Console.WriteLine("Parsing " + random); 
     Dump(parser); 
     Console.WriteLine(); 
     Console.ReadLine(); 
    } 

    private static TextFieldParser CreateParser(string value, params string[] delims) 
    { 
     var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(ToStream(value)); 
     parser.Delimiters = delims; 
     return parser; 
    } 

    private static void Dump(TextFieldParser parser) 
    { 
     while (!parser.EndOfData) 
      foreach (var field in parser.ReadFields()) 
       Console.WriteLine(field); 
    } 

    static Stream ToStream(string value) 
    { 
     return new MemoryStream(Encoding.Default.GetBytes(value)); 
    } 
} 
Смежные вопросы