Разделить слишком длинную строку

У меня есть строка, как на следующем рисунке: Разделить слишком длинную строку

Я использую API, который принимает эту большую строку в json, например, {"data" : "the large string which in the picture"} Поэтому я хотел разработать его и отправить строку в двух запросах, но когда я пытался использовать Length / 2, я получил половину этой большой строки, но не завершенную строку, как на следующем рисунке: Разделить слишком длинную строку

Я хочу получить половину этой строки с завершенной строкой, чтобы избежать тайм-аута в запросах

код, который дал мне этот результат:

            DataPart1.data = Encoding.ASCII.GetString(dataByte.Take(dataByte.Length / 2).ToArray());

            DataPart2.data = Encoding.ASCII.GetString(dataByte.Skip(DataPart1.data.Count()).ToArray()).ToString();

пожалуйста, опубликуйте код, который вы пробовали!

Prashant Pimpale 17.12.2018 12:03

Какая длина строки?

Dmitry Bychenko 17.12.2018 12:05

@DmitryBychenko огромный и непостоянный

Abdelrhman Elsaid 17.12.2018 12:06

вы можете посчитать строки, а затем разделить их на 2, чтобы получить половину вашей длинной строки

er-sho 17.12.2018 12:06

@ er-shoaib в строке нет строк

Abdelrhman Elsaid 17.12.2018 12:07

Самый простой способ - разделить строку разделителем новой строки, а затем присоединить к ней половину массива и отправить ее, но это будет очень-очень медленно. Как насчет того, чтобы найти половину строки, а затем найти следующий символ новой строки в цикле?

Mailosz 17.12.2018 12:08

@PrashantPimpale я разместил код, который я пробовал

Abdelrhman Elsaid 17.12.2018 12:08

Я видел на вашем втором снимке экрана, что в вашем тексте есть строки, поэтому я предлагаю вам строки

er-sho 17.12.2018 12:09

@ er-shoaib на моем изображении просто строка из компилятора, если бы мне нужно было oooooooooooo, большой экран был бы показан как одна строка

Abdelrhman Elsaid 17.12.2018 12:11

@Mailosz: Тоже моя первая идея, но есть более быстрый способ. Разрежьте нить на 2 половины. Искать последний перенос строки в первой строке. Обрежьте его там и положите оставшуюся перед второй ниткой.

H.G. Sandhagen 17.12.2018 12:11

@ H.G.Sandhagen Верно, это было бы быстрее, а в некоторых случаях проще реализовать.

Mailosz 17.12.2018 12:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
11
342
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Чтобы найти точный индекс, по которому вы хотите разделить строку, вы можете попробовать найти ближайший \r\n рядом с серединой строки, используя метод String.IndexOf(string value, int startIndex). Код будет выглядеть примерно так

var str = "1,2,3,4\r\n5,6,7,8\r\n9,10,11,12";
var half = str.Substring(0, str.IndexOf("\r\n", str.Length / 2));

Что приводит к "1,2,3,4\r\n5,6,7,8"

Возможно, вы захотите добавить дополнительную проверку для случаев, например, если середина строки находится в пределах последней строки или если используемый разделитель строк отличается от \r\n.

Мне это нравится, это быстро и просто и не требует цикла, как моя идея.

Mailosz 17.12.2018 12:16

Учитывая, что входная строка может иметь разную длину, может быть лучше группировать запросы до известной длины, а не просто разделять их пополам.

int REQUEST_SIZE = 1024;
string requestDelimiter = "\r\n";
int requestStart = 0;
int requestEnd = 0;

while(requestStart < dataByte.Length)
{
   // Sending loop
   int batchLength = requestStart+REQUEST_SIZE;
   if (requestStart+batchLength > dataByte.Length)
   {
      // Cover for when the end of the string exceeds batchLength
      // Ensure that the batchLength is adjusted to be within the string length
      batchLength = dataByte.Length - requestStart;
   }
   requestEnd = dataByte.IndexOf(requestDelimiter, batchLength, StringComparison.Ordinal);
   var requestData = dataByte.Substring(requestStart, requestEnd - requestStart);
   // TODO: process requestData

   requestStart = requestEnd;
}

Приведенный выше код разбивает запрос на блоки по 1024 символа.

Обратите внимание: непроверенный код - возможны опечатки.

почему вышеупомянутый ответ ломается, я попробовал его на строке, которая на картинке в вопросе, и она сработала

Abdelrhman Elsaid 17.12.2018 12:40

Я не могу припомнить, если batchLength = dataByte.Length - requestStart; должен быть batchLength = dataByte.Length - requestStart -1;. Но как я уже сказал - непроверенный код. Это скорее доказательство концепции, чем проверенный образец кода.

Kami 17.12.2018 12:42

@AbdelrhmanElsaid Эту переменную я переименовал в batchLength. Исправлено.

Kami 17.12.2018 12:49

пожалуйста, когда вы будете свободны, протестируйте свой код, потому что я получил исключение в `` `` var requestData = DataPart1.data.Substring (requestStart, requestEnd); `` System.ArgumentOutOfRangeException: 'Index and length must refer to a location within the string. Parameter name: length'

Abdelrhman Elsaid 17.12.2018 13:12

вторым аргументом string.Substring(int index, int length) должна быть длина, а не индекс. То есть var rquestData = dataByte.Substring(requestStart, requestEnd - requestStart);

Imantas 18.12.2018 08:41

Другие вопросы по теме