Индекс и длина должны указывать на местоположение в строке - PullRequest
0 голосов
/ 29 ноября 2011

Я пытаюсь разрезать строку на 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()) : "" + "|||||")

Код сам генерирует выходной файл, но без данных. Все, что я получаю, это верхний и нижний колонтитулы с ошибкой «Индекс и длина должны относиться к месту в строке», указанному внизу выходного файла.

Буду признателен за помощь в решении моей проблемы.

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

Я думаю, что вы ошибаетесь из-за того, как работает подстрока.

2-й параметр - это длина строки, которую нужно извлечь, а не индекс, к которому вы хотите закончить - MSDN Ref

Параметры

startIndex Тип: System.Int32 Начинающаяся с нуля позиция начального символа подстроки в этом случае.
length Тип: 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()
        : "|||||");

Этот вопрос - Разделение строки / числа на каждый N-й символ / число? может помочь вам с более приятным кодом

2 голосов
/ 29 ноября 2011

Вы сказали это сами,

Общая длина строки составляет 173.

Еще здесь

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

вы пытаетесь создатьподстрока, которая обращается к данным до символа 180 .... который длиннее вашей строки длиной 173.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...