2012-11-22 51 views
-1

您可以使用C#來幫助我嗎? 我試圖創建在C#中的函數打開一個CSV文件,並將它們保存到一個數組:從CSV文件讀取並存儲到數組

FileStream fileStream = new FileStream(guid.ToString(), FileMode.Open); 
for (int i = 1; i > 200; i++) // it checks the first 200 lines 
{ 
    int j = 0; 
    string[] str = new string[j]; 
    do 
    {     
     // saving each character to the variable until comma is found 

    } while(str == '\n'); // read each character in a for loop until new line character found 
} 

你能幫我嗎?

+1

你可以通過從VisualBasis.Net程序集中「借用」一個很好的實現來作弊:http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx – rene

+0

如果你要小心,自己動手,csv文件中有一些特殊字符。 –

回答

3

事情是這樣的:

using (StreamReader r = new StreamReader(guid.ToString())) 
{ 
    string line; 
    int linesCount; 
    ArrayList result = new ArrayList(); 
    while ((line = r.ReadLine()) != null && linesCount++ <= 200) 
    { 
     result.AddRange(line.Split(',')); 
    } 
} 
0

您可以使用string.Split(',')擴展方法。

using (StreamReader streamReader = new StreamReader(File.OpenRead(guid.ToString()))) 
{ 
    for (int i = 0; i <= 200; ++i) 
    {  
     string[] str = streamReader.ReadLine().Split(','); 
    } 
} 

Split擴展方法將返回由逗號分隔的各個值的字符串數組。

1

關於什麼:

string[] lines = File.ReadAllLines(path); 
if(lines.Length >= 200){ 
    for(int i = 0; i < 200; i++){ 
      string[] str = lines[i].Split(','); 
      //do something here 
    } 
} 
3

解析CSV手實際上是非常棘手的。重新使用TextFieldParser(添加對Microsoft.VisualBasic程序集的引用)可能會更好。

using Microsoft.VisualBasic.FileIO; 

.... 

string[,] parsedCsv; 
List<string[]> csvLines = new List<string[]>(); 
TextFieldParser parser = new TextFieldParser(new FileStream(guid.ToString(), FileMode.Open)); 
parser.Delimiters = new string[] { "," }; 
parser.TextFieldType = FieldType.Delimited; 
int maxLines = 200, lineCount = 0; 

try 
{ 
    while (!parser.EndOfData && lineCount++ < maxLines) 
    { 
     csvLines.Add(parser.ReadFields()); 
    } 
} 
catch (MalformedLineException) 
{ 
    Console.WriteLine("Line Number: {0} Value: {1}", parser.ErrorLineNumber, parser.ErrorLine); 
    return; 
} 

parsedCsv = new string[csvLines.Count, csvLines[0].Length]; 

for (int i = 0; i < csvLines.Count; i++) 
{ 
    for (int j = 0; j < csvLines[i].Length; j++) 
    { 
     parsedCsv[i, j] = csvLines[i][j]; 
    } 
} 

我在這裏假定輸出將是一個字符串的2-d陣列 - 你可能需要根據你所追求的調整這個代碼,特別是如果你要應付的情況每行不具有相同數量的字段(可能不太可能,但仍然)。

關於TextFieldParser真正有用的事情是,它會應付不同種類的定界符。例如,通過設置parser.Delimiters = new string[] { "\t" };,此相同的代碼可以解析製表符分隔的文本。

+0

LINQ如何很好地處理.Split()擴展時,爲什麼會遇到所有這些麻煩? –

+0

@JesseCarter用.Split()解析'「a,b,c,\」x,y,z \「」',你會明白我的意思。 –

+0

夠公平的,但我們沒有理由相信他的檔案是這樣設立的。我見過的大多數CSV文件在每行上都有單個CSV條目,並且可以使用字符串輕鬆解析。分隔符上的分割 –