如何将空格(引号内的空格除外)转换为C#中的逗号?

时间:2009-06-19 20:17:34

标签: c# string

假设我有一个这样的字符串:

one two three "four five six" seven eight

我希望将其转换为:

one,two,three,"four five six",seven,eight

在C#中最简单的方法是什么?

8 个答案:

答案 0 :(得分:9)

假设引号不可避免,您可以执行以下操作。

public string SpaceToComma(string input) { 
  var builder = new System.Text.StringBuilder();
  var inQuotes = false;
  foreach ( var cur in input ) {
    switch ( cur ) { 
      case ' ':
         builder.Append(inQuotes ? cur : ',');
         break;
      case '"':
         inQuotes = !inQuotes;
         builder.Append(cur);
         break;
      default:
         builder.Append(cur);
         break;
    }
  }
  return builder.ToString();
}

答案 1 :(得分:2)

 static string Space2Comma(string s)
 {
    return string.Concat(s.Split('"').Select
        ((x, i) => i % 2 == 0 ? x.Replace(' ', ',') : '"' + x + '"').ToArray());
 }

答案 2 :(得分:0)

我会为此目的使用Regex类。

正则表达式可用于匹配您的输入,将其分解为单个组,然后您可以根据需要重新组合。您可以在regex classes here找到文档。

Regex rx = new Regex( "(\w)|([\"]\w+[\"])" );
MatchCollection matches = rx.Matches("first second \"third fourth fifth\" sixth");
string.Join( ", ", matches.Select( x => x.Value ).ToArray() );

答案 3 :(得分:0)

我的第一个猜测是使用已编写的解析器,并简单地更改符合您需要的分隔符和引号字符(分别为“和”)。

看起来你可以在C#中使用它: http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx

也许如果您将分隔符更改为“”,它可能适合您在文件中读取的需要,然后只需为每行调用String.Join()a。

答案 4 :(得分:0)

这是我提出的更可重用的功能:

private string ReplaceWithExceptions(string source, char charToReplace, 
    char replacementChar, char exceptionChar)
{
    bool ignoreReplacementChar = false;
    char[] sourceArray = source.ToCharArray();

    for (int i = 0; i < sourceArray.Length; i++)
    {
        if (sourceArray[i] == exceptionChar)
        {
            ignoreReplacementChar = !ignoreReplacementChar;
        }
        else
        {
            if (!ignoreReplacementChar)
            {
                if (sourceArray[i] == charToReplace)
                {
                    sourceArray[i] = replacementChar;
                }
            }
        }
    }

    return new string(sourceArray);
}

用法:

string test = "one two three \"four five six\" seven eight";
System.Diagnostics.Debug.WriteLine(ReplaceWithExceptions(test, char.Parse(" "),
    char.Parse(","), char.Parse("\"")));

答案 5 :(得分:0)

这可能有些过分,但是如果您认为问题可能会泛化,例如需要通过其他类型的字符进行拆分,或者有其他规则来定义令牌,则应考虑使用解析器生成器,例如{ {3}}或者自己写一个简单的。例如,Coco / R将根据您提供的EBNF语法生成词法分析器和解析器。词法分析器将是DFA或状态机,它是JaredPar提供的代码的通用形式。你对Coco / R的语法定义如下:

CHARACTERS
alphanum = 'A'..'Z' + 'a'..'z' + '0'..'9'.

TOKENS
unit   = '"' {alphanum|' '} '"' | {alphanum}.

然后,生成的词法分析器将相应地扫描并设置您的输入。

答案 6 :(得分:0)

根据我对原始问题的评论,如果您不需要最终结果中的引号,这将完成工作。如果你需要引号,请随意忽略这一点。

private String SpaceToComma(string input)
{
    String[] temp = input.Split(new Char[] { '"' }, StringSplitOptions.RemoveEmptyEntries);
    for (Int32 i = 0; i < temp.Length; i += 2)
    {
        temp[i] = temp[i].Trim().Replace(' ', ',');
    }
    return String.Join(",", temp);
}

答案 7 :(得分:0)

@Mehrdad打败了我,但我想我会发布它:

static string Convert(string input)
{
    var slices = input
        .Split('"')
        .Select((s, i) => i % 2 != 0
            ? @"""" + s + @""""
            : s.Trim().Replace(' ', ','));

    return string.Join(",", slices.ToArray());
}

LINQified并测试:-) ...对于完整的控制台应用程序:http://pastebin.com/f23bac59b