Home > other >  Is it possible to build a list from a carriage return separated string?
Is it possible to build a list from a carriage return separated string?

Time:11-12

Background

I have the following string:

var MyString = 'Test1⏎Test2⏎Test3⏎Test4'

= line feed = \n

What I'm trying to do

  • I want to create a List which is a list of lines. Basically every item that is followed by a \n would become an entry in the list.
  • I want the base string MyString to become shortened to reflect what pieces of the string have been moved to the List
  • The reason I want to leave a residual MyString is that new data might come in later that might be considered part of the same line, so I do not want to commit the data to the List until there is a carriage return seen

What the result of all this would be

So in my above example, only Test1 Test2 Test3 are followed by \n but not Test4

Output List would be: [Test1, Test2, Test3]

MyString would become: Test4

What I've tried and failed with

I tried using LineSplitter but it seems to want to take Test4 as a separate entry as well

final lines = const LineSplitter().convert(MyString);
for (final daLine in lines) {
  MyList.add(daLine);
}

And it creates [Test1, Test2, Test3, Test4]

CodePudding user response:

A solution would be to just .removeLast() on the list that you split.

String text = 'Test1\nTest2\nTest3\nTest4';

List<String> list = text.split('\n');
text = list.removeLast();

print(list); // [Test1, Test2, Test3]
print(text); // Test4

CodePudding user response:

To me you are combining two questions. Every language I know has built-in ways to split a string on a char, including newline chars. The distinct thing you want is a split function that doesn't include the last entry.

You may be combining your answers as well :) Is there some resource constraint or streamed input that prevents you from just building the list, then popping off the final entry?

If yes: I think you have to build your own split. Look at the implementation code for LineSplitter(), and make something similar except which leaves the final entry.

If no: simply call

MyString = MyList.removeLast();

after your for-loop.

  • Related