如何使用c#在csv中获取特定于值的列值?

时间:2013-07-26 10:56:24

标签: c# winforms csv

我在c#winforms中做了一个项目。

我想在csv中获得第一列值。

var reader = new StreamReader(File.OpenRead(@"C:\test.csv"));
List<string> listA = new List<string>();
List<string> listB = new List<string>();
while (!reader.EndOfStream)
{
 var line = reader.ReadLine();
 var values = line.Split(';');
 listA.Add(values[0]);

}


------------------
no    |name     | 

------------------
1     |wwwwww
2     |yyyyy
3     |aaaaa 
4     |bbbbbb

现在我正在使用上面的代码。它逐行给出值。我想要listA中的所有名称值

有人有想法吗?

4 个答案:

答案 0 :(得分:1)

现在可以在不读取整个文件的情况下读取CSV中的列。您可以使用一些包装器(例如:LINQ to CSV library)但它们只是“隐藏”读取操作。

答案 1 :(得分:1)

是的 - 你现在正在分裂;

请尝试使用逗号。

最好使用专用库btw ...

答案 2 :(得分:1)

有些人对Regex不屑一顾,但我认为它提供了很好的灵活性。这是一个灵感来自的例子 Adrian Mejia。基本上,您可以选择在上下文中分隔符有效的特定字符。即“你好,世界”或“你好,世界”中的逗号是有效的。

    static void Main(string[] args)
    {
        string csv = "Hello,1,3.5,25,\"speech marks\",'inverted commas'\r\nWorld,2,4,60,\"again, more speech marks\",'something else in inverted commas, with a comma'";

        // General way to create grouping constructs which are valid 'text' fields
        string p = "{0}([^{0}]*){0}"; // match group '([^']*)' (inverted commas) or \"([^\"]*)\" (speech marks)
        string c = "(?<={0}|^)([^{0}]*)(?:{0}|$)"; // commas or other delimiter group (?<=,|^)([^,]*)(?:,|$)
        char delimiter = ','; // this can be whatever delimiter you like
        string p1 = String.Format(p, "\""); // speechmarks group (0)
        string p2 = String.Format(p, "'"); // inverted comma group (1)
        string c1 = String.Format(c, delimiter); // delimiter group (2)
        /*
         * The first capture group will be speech marks ie. "some text, "
         * The second capture group will be inverted commas ie. 'this text'
         * The third is everything else seperated by commas i.e. this,and,this will be [this][and][this]
         * You can extend this to customise delimiters that represent text where a comma between is a valid entry eg. "this text, complete with a pause, is perfectly valid"
         * 
         * */
        //string pattern = "\"([^\"]*)\"|'([^']*)'|(?<=,|^)([^,]*)(?:,|$)";
        string pattern = String.Format("{0}|{1}|{2}", new object[] { p1, p2, c1 }); // The actual pattern to match based on groups

        string text = csv;

        // If you're reading from a text file then this will do the trick.  Uses the ReadToEnd() to put the whole file to a string.
        //using (TextReader tr = new StreamReader("PATH TO MY CSV FILE", Encoding.ASCII))
        //{
        //    text = tr.ReadToEnd(); // just read the whole stream
        //}

        string[] lines = text.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); // if you have a blank line just remove it?
        Regex regex = new Regex(pattern, RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); // compile for speed

        List<object> rowsOfColumns = new List<object>();
        foreach (string row in lines)
        {
            List<string> columns = new List<string>();
            // Find matches.
            MatchCollection matches = regex.Matches(row);
            foreach (Match match in matches)
            {
                for (int ii = 0; ii < match.Groups.Count; ii++)
                {
                    if (match.Groups[ii].Success) // ignore things that don't match
                    {
                        columns.Add(match.Groups[ii].Value.TrimEnd(new char[] { delimiter })); // strip the delimiter
                        break;
                    }
                }
            }
            // Do something with your columns here (add to List for example)
            rowsOfColumns.Add(columns);
        }
    }

答案 3 :(得分:0)

var reader = new StreamReader(File.OpenRead(@"C:\test.csv"));
List<string> listA = new List<string>();

while (!reader.EndOfStream)
{

 var line = reader.ReadLine();

string[] dates = line.Split(',');           
for (int i = 0; i < dates.Length; i++)
  {
  if(i==0)
  listA.Add(dates[0]);
  }


 }