【问题标题】:input string comes in variety of separating delimiter, how to check for the right one?输入字符串有多种分隔符,如何检查正确的分隔符?
【发布时间】:2012-10-02 10:19:51
【问题描述】:

我有一个小问题。 我正在处理一个关键字字符串,它来自不同的提供商(我无法控制),他们都以不同的格式发送字符串。

字符串中的关键字可以用逗号、分号、空格或制表符分隔。 在一个字符串中,只使用一种类型的分隔符。

你会如何识别它?

我在想类似的东西(伪代码):

string delimiters = { ",",";"," " };

var x = str.split(delimiters[0]).count();

var y = str.split(delimiters[1]).count();

var z = str.split(delimiters[2]).count();

然后检查哪个是最大的并使用它。

你有更好的主意吗?

【问题讨论】:

  • 我喜欢你的想法 - 尝试每一个并检查哪个给出最合理的结果。
  • 你知道正确的字段数吗?
  • @TimSchmelter - 没有。它可以有 1 - 50 个关键字。但没有任何承诺。
  • 请注意,在某些情况下,“最流行”的分隔符并不是最好的——例如Bobsson, Bob;Davisson, David;Charlsson, Charliered one;green one;blue one.
  • @Rawling 是的,我知道有很多极端情况,这就是为什么我发布这个问题,试图在我开始工作之前找出所有问题。

标签: c# split delimiter


【解决方案1】:

您的想法非常有效,但我认为更好的解决方案是创建一个扩展方法并以这种方式返回一个锯齿状数组:

public static class Utilities {
    public static string[ ][ ] MultipleSplit( this string s, char[ ] delimiters ) {
        string[][] result = new string[ delimiters.Length ][ ];
        for ( int i = 0; i < delimiters.Length; i++ )
            result[ i ] = s.Split( delimiters[ i ] );

        return result;
    }

    public static string[ ] Larger( this string[ ][ ] jaggedArray ) {
        int index_larger = 0;

        for ( int i = 0; i < jaggedArray.Length; i++ ) {
            if ( jaggedArray[ i ].Length > jaggedArray[ index_larger ].Length )
                index_larger = i;
        }
        return jaggedArray[ index_larger ];
    }
}

然后像这里一样使用它:

string[][] result = str.MultipleSplit(delimiters);
string[] larger = result.Larger();

【讨论】:

  • +1 为漂亮的代码,我只写了伪代码,因为我还不确定如何去做。
【解决方案2】:

为什么不:

var result = str.Split(new[] {',', ';', ' '}, StringSplitOptions.None);

编辑:

var result = delimiters.Select(d => str.Split(d))
            .OrderByDescending(l => l.Count())
            .First();

【讨论】:

  • 他不确定哪个是正确的分隔符来分割字符串。
  • String.Split 的重载意味着:“采取任何这些”。但是 OP 想要使用他还不知道的特定分隔符。
【解决方案3】:

尝试使用正则表达式进行拆分。一个正则表达式是 [,;\s]。这将查找逗号、分号空格或制表符。

【讨论】:

  • 这仍然不会告诉我哪个是“赢家”
【解决方案4】:

虽然这里的建议可以接受并满足您当前的需求,但根本问题是

来自不同的供应商(我无法控制), 他们都以不同的格式发送字符串。

您需要与各个提供商就如何接受他们的信息达成某种形式的“合同”或协议。即使每个不同,系统也可以确定谁在提交数据并选择正确的解析器。

当前选项没有提供的一件事是确保您拥有良好数据的方法。如果提交的数据不好怎么办?你怎么知道?数据不好有关系吗?

【讨论】:

  • 我很难相信我可以说服“Photoshop”、“FotoStation”和其他一些软件的所有者同意一种格式。另外,既然你说的是成千上万的摄影师提交他们的作品,我不能强迫他们在与另一种软件合作多年的情况下购买一种软件。由于我构建的软件是手动操作的,因此人们可以看到结果并查看它是否包含“坏”数据。
  • 这在 OP 中并不清楚。而且我并不是建议强力玩家应该或将遵循您的自定义格式。但是,您确实有每个软件的标准格式,并且导入过程的一部分可能是选择信息源。
  • 对不起,如果我听起来很粗鲁,那不是本意。我无法控制传入的数据,如果可以的话,我永远不会发布这个问题。即使我会寻找每一个元数据编辑器软件并理解他们的输入,它仍然对我没有帮助,因为我不知道摄影师会上传什么。他们将图像批量上传到 ftp,并提供 csv 文件。他们没有任何类型的界面,我可以向他们询问格式,他们也不理解,有时只是他们相机的原始输出,其中包括一个 csv。
猜你喜欢
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
  • 2023-02-25
  • 2013-03-03
  • 1970-01-01
相关资源
最近更新 更多