彎路

今天,在處理一大段數據的時候,走了不少的彎路

數據格式是類似這樣:

  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          [email protected]  

我要做的是把每行的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,站在全局的角度重新思考纔是捷徑!

發佈了27 篇原創文章 · 獲贊 26 · 訪問量 50萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章