2011-11-29 64 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 ...不幸的是,括号内有一些由供应商创建的系统代码中的函数。我尝试过使用你的代码,但它仍然无法正常工作。 –

相关问题