LineSplitter în Dart

Împarte un text în rânduri, recunoscând \n, \r\n și \r; funcționează și pe fluxuri cu transform.

Sintaxă
const LineSplitter()
static Iterable<String> split(String lines, [int start = 0, int? end])

Ce face LineSplitter

LineSplitter împarte textul în rânduri și recunoaște toate felurile de sfârșit de rând: \n (Linux, macOS), \r\n (Windows) și \r. Caracterele de sfârșit de rând nu apar în rezultat.

Metoda statică LineSplitter.split(text) returnează un Iterable<String>. Dacă textul se termină cu un sfârșit de rând, nu apare un ultim rând gol (spre deosebire de text.split('\n')).

Ca obiect, const LineSplitter() este un convertor: stream.transform(utf8.decoder).transform(const LineSplitter()) transformă un flux de octeți într-un flux de rânduri, la citirea fișierelor sau a ieșirii unui proces.

Parametri

Parametru Descriere
lines Textul de împărțit.
start, end Opțional. Partea din text care se împarte.

Ce returnează

split: rândurile, ca Iterable<String>.

Exemple

Exemplul 1: Diferența față de split(‘\n’)

import 'dart:convert';

void main() {
  const text = 'Ana\r\nIon\nMaria\n';
  print(text.split('\n'));
  print(LineSplitter.split(text).toList());
  print(LineSplitter.split(text).length);
}

Rezultat

[Ana
, Ion, Maria, ]
[Ana, Ion, Maria]
3

Exemplul 2: Numărarea rândurilor necompletate

import 'dart:convert';

void main() {
  const lista = '''lapte
pâine

ouă
''';
  final produse = LineSplitter.split(lista).where((r) => r.trim().isNotEmpty).toList();
  print('${produse.length} produse: ${produse.join(', ')}');
}

Rezultat

3 produse: lapte, pâine, ouă

Exemplul 3: Rânduri dintr-un flux

import 'dart:convert';

Future<void> main() async {
  final flux = Stream.fromIterable(['Iași;3', '00000\nCluj;', '400000\n']);
  final randuri = await flux.transform(const LineSplitter()).toList();
  for (final r in randuri) {
    final [oras, locuitori] = r.split(';');
    print('$oras are $locuitori locuitori');
  }
}

Rezultat

Iași are 300000 locuitori
Cluj are 400000 locuitori

Greșeli frecvente

  • Folosești text.split('\n') pe un fișier venit din Windows: fiecare rând păstrează un \r la final, invizibil la afișare dar prezent la comparații.
  • Scrii LineSplitter().split(text). split este statică: LineSplitter.split(text).

Comenzi înrudite

  • utf8.decoder: Convertoarele din spatele lui utf8: decoder transformă fluxuri de octeți în text, encoder face invers.
  • File.readAsLines: Citește un fișier text și returnează lista rândurilor, fără caracterele de sfârșit de rând.
  • stdin: stdin este intrarea standard a programului: ce scrie utilizatorul la tastatură sau ce primește programul printr-un pipe.