如何从逗号分隔文件中读取值?

时间:2011-09-15 04:44:49

标签: c# .net csv

我想在c sharp中用逗号分隔的行的文本文件中读取单词。

例如,我想读这一行:

9/10/2011 10:05,995.4,998.8,995.4,997.5,118000

并获取值:9/10/2011 10:05995.4998.8995.4997.5118000

接下来,我还需要将日期格式更改为MMddYYYY,将时间格式更改为HHmmss(例如100500)。

我正在使用此代码进行读取是否有任何错误

 private void button1_Click(object sender, EventArgs e)
 {
     StreamReader reader1 = File.OpenText(Path1);
     string str = reader1.ReadToEnd();
     reader1.Close();
     reader1.Dispose();
     //     File.Delete(Path1);

     string[] Strarray = str.Split(new char[] { Strings.ChrW(7) });
     int abc = Strarray.Length - 1;
     int xyz = 0;
     bool status = true;

     while (xyz <= abc)
     {
        try
        {
           status = true;
           string[] strarray1 = Strarray[xyz].Split(",".ToCharArray());
           string SecName = strarray1[0];
           int a2 = 0;
           while (status)  //If the selected list is empty or the text file has selected name this will execute
           {
              status = false;
              string SecSym = strarray1[1];
              int DT = int.Parse(strarray1[2]);
              int TM = int.Parse(strarray1[3]);
              float O = float.Parse(strarray1[2]);
              float H = float.Parse(strarray1[3]);
              float L = float.Parse(strarray1[4]);
              float C = float.Parse(strarray1[5]);
              double OI = double.Parse(Convert.ToString(0));
              float V = float.Parse(strarray1[6]);

              //   string a = string.Concat(SecName, ",",SecSym,",", DT, ",", TM, ",", O, ",", H, ",", L);
              //writer.WriteLine(a);
           }
        }
        catch
        { }
     }
   }
}

6 个答案:

答案 0 :(得分:14)

.Net附带了一个可用于获取数据的现成CSV解析器。它是VB.net的一部分,但您可以通过添加对程序集Microsoft.VisualBasic的引用(它很好,非常好)和一个using语句using Microsoft.VisualBasic.FileIO;来轻松地在C#中使用它。

代码应该易于理解:

List<String[]> fileContent = new List<string[]>();

using(FileStream reader = File.OpenRead(@"data.csv")) // mind the encoding - UTF8
using(TextFieldParser parser = new TextFieldParser(reader))
{
    parser.TrimWhiteSpace = true; // if you want
    parser.Delimiters = new[] { "," };
    parser.HasFieldsEnclosedInQuotes = true; 
    while (!parser.EndOfData)
    {
        string[] line = parser.ReadFields();
        fileContent.Add(line);
    }
}

CSV非常简单,但它可能包含逗号和换行符的引用值,因此使用Split不是最佳选择。

答案 1 :(得分:4)

使用String.Split方法获取字符串数组:

string[] ar = line.Split(',')

答案 2 :(得分:4)

这应该让你开始。

using System;
using System.IO;

public class Sample
{
    public static void Main() {
        using (StreamReader reader = new StreamReader("yourfile.txt")) {
            string line = null;
            while (null != (line = reader.ReadLine())) {
                string[] values = line.Split(',');
                DateTime date = DateTime.Parse(values[0];
                float[] numbers = new float[values.Length - 1];
                for (int i = 1; i < values.Length - 1; i++)
                    numbers[i - 1] = float.Parse(values[i]);

                // do stuff with date and numbers
            }
        }
    }
}

我还发布了一个简单的CsvReader class,可能对您有所帮助。

答案 3 :(得分:2)

对于快速简单的解决方案,您可以流式传输文件并使用String.Split解析每一行,如下所示:

using (var sr = File.OpenText("myfile.csv"))
{
    string line;
    while ((line = sr.ReadLine()) != null)
    {
        var fields = line.Split(',');
        var date = DateTime.Parse(fields[0].Trim());
        var value1 = fields[0].Trim();
    }
}

然而,这个appraoch如果相当容易出错,对于更健壮的解决方案,请查看CsvReader项目,它非常适合解析像这样的CSV文件。它将使用逗号处理字段值,修剪字段前后的空格等等。

如果您需要从DateTime.Parse无法识别的格式解析日期字符串,请尝试使用DateTime.ParseExact

答案 4 :(得分:1)

对于任务的第一部分,使用Split方法并将,作为分隔符。要将字符串日期时间从一种格式转换为另一种格式,您需要将该字符串转换为日期时间(DateTime.ParseDateTime.ParseExact),然后使用DateTime.ToString方法转换为最终格式。

答案 5 :(得分:0)

行包含您的输出

   StreamReader sStreamReader = new StreamReader("File Path");
    string AllData = sStreamReader.ReadToEnd();
    string[] rows = AllData.Split(",".ToCharArray());