2011-11-29 84 views
-4

我試圖將字符串切割成6個字段,每個字段的最大長度爲30。字符串的總長度是173.我創建瞭如下的代碼;索引和長度必須指向字符串內的位置

(
(("" + dr["MESSAGE"]).ToString().Trim().Length<30 && 
("" + dr["MESSAGE"]) != "")?(("" + dr["MESSAGE"]) + "|||||") : 
(("" + dr["MESSAGE"]).ToString().Trim().Length>150 && 
("" + dr["MESSAGE"]).ToString().Trim().Length<181)? 
(("" + dr["MESSAGE"]).Trim().PadRight(180,' ').Substring(0,30).Trim() + "|" + 
("" + dr["MESSAGE"]).Trim().PadRight(180,' ').Substring(31,60).Trim() + "|" + 
("" + dr["MESSAGE"]).Trim().PadRight(180,' ').Substring(61,90).Trim() + "|" + 
("" + dr["MESSAGE"]).Trim().PadRight(180,' ').Substring(91,120).Trim() + "|" + 
("" + dr["MESSAGE"]).Trim().PadRight(180,' ').Substring(121,150).Trim() + "|" + 
("" + dr["MESSAGE"]).Trim().PadRight(180,' ').Substring(151,180).Trim()) : "" + "|||||") 

該代碼本身生成一個輸出文件,但沒有數據。我所得到的是標題和頁腳,錯誤「索引和長度必須指向輸出文件底部指示的字符串內的位置」。

希望你能幫助我解決我的問題。

+0

某處沿着你以前做的方式超越了字符串的邊界。但是,「編寫」代碼的方式讓您(和我們)很少有線索知道代碼出錯的地方。將你的代碼分成幾行和幾個階段。你將能夠看到錯誤的確切位置。 – Adrian

+0

也許你應該考慮讓你的代碼更具可讀性。 –

回答

2

你自己說的,

字符串的總長度爲173

然而這裏

().PadRight(180,' ').Substring(151,180).Trim()) 

您要創建一個訪問數據高達字符的子串180 ....比你的字符串長173。

+0

padright會使字符串超過180個字符.... – Adrian

+0

我把180放入的原因是因爲用戶可以放置的總的最大長度是180.因爲我不知道用戶將輸入的字符串的長度實際長度,我填充字符串的空間直到180,每當它<180。 –

+0

啊好點!我有一個可能的想法是,它將字符串填充到180個字符,但索引從0開始當你使用子字符串(只是想在這裏我不能測試這個),所以0 - 179是180個字符。即訪問180是1個字符太多 – Purplegoldfish

2

我想你錯了子串的工作原理。

的第二個參數是字符串的長度要提取,不是你想在完成指標 - MSDN Ref

參數

的startIndex類型:System.Int32 從零開始的起始字符 在這個例子中的一個子串的位置。
長度類型:System.Int32 子字符串中的字符數。

您希望爲第二個參數指定30,因爲您想將其分成30個字符塊。

我認爲這應該工作(但代碼真正需要收拾!):

((dr["MESSAGE"].ToString().Trim().Length < 30 && test != "") 
    ? (dr["MESSAGE"].ToString() + "|||||") 
    : (dr["MESSAGE"].ToString().Trim().Length > 150 && test.Trim().Length < 181) 
     ? dr["MESSAGE"].ToString().Trim().PadRight(180, ' ').Substring(0, 30).Trim() + "|" + 
      dr["MESSAGE"].ToString().Trim().PadRight(180, ' ').Substring(30, 30).Trim() + "|" + 
      dr["MESSAGE"].ToString().Trim().PadRight(180, ' ').Substring(60, 30).Trim() + "|" + 
      dr["MESSAGE"].ToString().Trim().PadRight(180, ' ').Substring(90, 30).Trim() + "|" + 
      dr["MESSAGE"].ToString().Trim().PadRight(180, ' ').Substring(120, 30).Trim() + "|" + 
      dr["MESSAGE"].ToString().Trim().PadRight(180, ' ').Substring(150, 30).Trim() 
     : "|||||"); 

這個問題 - Splitting a string/number every Nth Character/Number?可能會幫助你更好一些代碼

+0

感謝Richard D.不幸的是,除了每行表達式之外,我無法執行任何編碼。我們的供應商提供了一個工具,可以根據我的需要從數據庫生成輸出文件。但該工具只允許我做一個類似於給的編碼。我試過你的代碼,但我仍然得到相同的結果。 –

+0

@andiecruz我整理了一下這個例子,並在本地進行了測試,它似乎可行。你能再試一次,讓我知道它是否適合你?似乎有太多的括號可能導致問題。 –

+0

@RichardD ...不幸的是,括號內有一些由供應商創建的系統代碼中的函數。我嘗試過使用你的代碼,但它仍然無法正常工作。 –

相關問題