弯路

今天,在处理一大段数据的时候,走了不少的弯路

数据格式是类似这样:

  2007ag          20***ag         이윤미          xxym2***g.co.kr         							
  222630          nr***an          한누리          leek***lyasiana.com     							
  aacm            152***57         이기훈          leek***lyasiana.com     							
  agmaster        agm***ster       안그라픽스        leek***flyasiana.com     							
  agtest          ag***est         테스트아이디       tes***test.net           							
  ahn2011         dksr***fkvlrtm   ahn          sloh@ag.co.kr  

我要做的是把每行的4列数据都提取出来。

因为之前我处理的大段数据,分隔符都是比较统一的逗号或者是其他比如破折号之类的

所以,我一般采用对逐个关键字(比如逗号)的定位,把坐标写入列表,最后,统一提取列表的第XX个的位置就好了

以下是代码块:

//分隔符
string SpitStrFst = " ";
string SpitStrOthers = " ";

List<int> Pos = new List<int>();
Pos.Add(Str.IndexOf(SpitStrFst, 0));
for (int i = 0; i < Str.Length; )
{
    int Find = Str.IndexOf(SpitStrOthers, i);
    if (Find == -1) break;
    Pos.Add(Find);
    i = Find + 1;
}

但是今天的问题就出现在这,两个数据之间的空格数量是不定的(数据源是从Excel之间复制来的)所以总是不能很好的对数据定位

比如,得到的Pos列表是这样的结果:


很明显,我要做的是,把这些连续的排列,做个清理,只保留一个就够(比如8,9,10,11,12,13,14,15,16,17只保留8)

开始,我这样写,思路是,如果下一个定位和与上一个只差1,说明是连续的,则舍弃:

//分隔符
string SpitStrFst = " ";
string SpitStrOthers = " ";

List<int> Pos = new List<int>();
Pos.Add(Str.IndexOf(SpitStrFst, 0));
for (int i = 0; i < Str.Length; )
{
    int Find = Str.IndexOf(SpitStrOthers, i);
    try
    {
        if (Find == -1) break;
        if (Pos.Count > 0)
        {
            if (Find == Pos[Pos.Count - 1] + 1)
            {
                throw new Exception("Continue2Next");
            } 
        }
        Pos.Add(Find);
        if (Find == Str.Length) break;
    }
    catch
    {
    }
    finally
    {
        i = Find + 1;
    }
}
我也是后来,才发现这是个逻辑问题,因为,代码的确是像我说的一样舍弃了,但是Pos变成这样了:0,0,2,4,6,8.....

我发觉,单单提取下一位也不行,需要检测,如果这已经是下一位了,需要检测前两位是否是连续的……慢慢,思路开始复杂起来。

这时候,脑海中一个声音跳出来,这个问题真的这么复杂么!?

我打断了继续复杂化的思路,开始重新审视整个数据,我发现,问题的确是出在空格的长度上,如果……

如果,我把多个空格合并成一个,那样的话,不就和之前的一样能处理了么,于是,我写了这样的函数,用来把多个空格合并成一个:

public static string MultiSpacesToOne(string InputStr)
{
    List<int> Pos = new List<int>();
    for (int i = 0; i < InputStr.Length; i++)
    {
        if (InputStr[i] == ' ') Pos.Add(i);
    }
    for (int i = Pos.Count - 1; i > 0; i--)
    {
        int Tail = Pos[i];
        int BeforTail = Pos[i - 1];
        if (BeforTail == Tail - 1)
        {
            InputStr = InputStr.Remove(Tail, 1);
        }
    }
    return InputStr;
}

然后,显然,问题很快解决。而代码,除了这个新加入的函数,要做改变的,仅仅是加了这一句话:

Str = MultiSpacesToOne(Str);

我在想,假如,我们遇到问题时,如果是从问题的源头开始思考解决办法,而不是先从修复的角度,是不是会更好的解决很多问题呢。

一直都是,我们会觉得推翻现有的,重新设计一个东西,一定要复杂的多,其实,我们错了,错在惯性思维上,maybe,站在全局的角度重新思考才是捷径!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值