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

本文关键字:获取 何使用 csv | 更新日期: 2023-09-27 18:24:58

我用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

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

有人知道吗?

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

现在有一种方法可以在不读取整个文件的情况下读取CSV中的列。您可以使用一些包装器(例如:LINQ到CSV库),但它们只是"隐藏"读取操作。

是-您当前正在上进行拆分;

请尝试使用逗号。

最好使用专用库btw…

有些人反对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);
        }
    }
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]);
  }

 }