2012-11-22 64 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条目,并且可以使用字符串轻松解析。分隔符上的分割 –

相关问题