【问题标题】:Split csv file where the separator also appears in the text拆分 csv 文件,其中分隔符也出现在文本中
【发布时间】:2021-09-18 08:22:46
【问题描述】:

我必须从 csv 文件中拆分以下行

1111,"公司名称","Street 70","Building Nr.1, 1st Floor, Room 34",City,2213

目前我正在使用以下代码。但仅当分隔符未出现在文本中时才有效

var values = line.Split(',');

上面的字符串就是这样解析的

values[0] 1111 
values[1] "Company Name" 
values[2] "Street 70" 
values[3] "Building Nr.1
values[4] 1st Floor
values[5] Room 34"
values[6] City
values[7] 2213

但我必须以这种方式解决它

values[0] 1111 
values[1] "Company Name" 
values[2] "Street 70" 
values[3] "Building Nr.1, 1st Floor, Room 34"
values[4] City
values[5] 2213

有人知道如何参数化拆分以使其正常工作

【问题讨论】:

    标签: c# split


    【解决方案1】:

    我会使用一个库来为您解析 CSV。这将处理忽略值中的分隔符(如果它们被引用)。

    我以前用过 CsvHelper - 真的很好。

    https://joshclose.github.io/CsvHelper/

    如果你想自己动手,那么你可以看看 CsvHelper 的代码,虽然它变得相当复杂:

    https://github.com/JoshClose/CsvHelper/blob/master/src/CsvHelper/CsvParser.cs

    【讨论】:

      【解决方案2】:

      如果有人在乎的话。为我找到了以下解决方案。

      var text = "";
      var isCharInValue = false;
      foreach (var currentChar in line)
      {
          if (currentChar == '"')
          {
              if (isCharInValue == false)
              {
                  isCharInValue = true;
              }
              else
              {
                  isCharInValue = false;
              }
          }
          if (isCharInValue == true && currentChar == ',')
          {
              text = text + ";;;;;;;;";
          }
          else
          {
              text = text + currentChar;
          }
      }
      
      
      
      var values = text.Split(',');
      
      int xx1 = values.Length;
      for (int i = 0; i < xx1; i++)
      {
          values[i] = values[i].Replace(";;;;;;;;", ",");
      }
      

      【讨论】:

        【解决方案3】:

        如果您需要一个简单的解决方案,可以使用这样的函数。
        字符串拆分会忽略带有双引号的值内的拆分字符。

        我们遍历字符串的字符,在找到分隔符时将它们划分为元素。 如果遇到双引号字符,那么在后面的字符中我们忽略分隔符,找到右双引号后,继续分割字符串。

        static List<string> CustomStringSplit(string inputString, char splitChar)
        {
            if (splitChar == '"')
                throw new Exception("Wrong split char");
        
            var result = new List<string>();
            var stringBuilder = new StringBuilder();
            var isCharInValue = false;
            foreach (var currentChar in inputString)
            {
                if (currentChar == splitChar && !isCharInValue)
                {
                    result.Add(stringBuilder.ToString());
                    stringBuilder.Clear();
                }
                else if (currentChar == '"')
                {
                    isCharInValue = !isCharInValue;
                }
                else
                {
                    stringBuilder.Append(currentChar);
                }
            }
            result.Add(stringBuilder.ToString());
        
            return result;
        }
        

        例如字符串(在开头和结尾添加空元素):

        var inputString = "\"\",1111,\"Company Name\",\"Street 70\",\"Building Nr.1, 1st Floor, Room 34\",City,2213,";
        

        我们得到元素:

        0 - ""
        1 - "1111"
        2 - "Company Name" 
        3 - "Street 70" 
        4 - "Building Nr.1, 1st Floor, Room 34"
        5 - "City"
        6 - "2213"
        7 - ""
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-06
          相关资源
          最近更新 更多