detectDelimiter method

String detectDelimiter(
  1. String sample
)

Detect the most likely field delimiter from a sample string.

Algorithm:

  1. Check for an Excel sep=X hint on the first line.
  2. A candidate qualifies only when it appears (outside quotes) on every sampled non-empty line: a real delimiter shows up in every row, so single-column text that merely contains a ; does not qualify.
  3. Qualifying candidates are ranked by count consistency across lines, then by column count; ties keep the earlier candidate (, before ;, \t, |).
  4. When nothing qualifies, the default , is returned.

Implementation

String detectDelimiter(String sample) {
  final (stripped, sepDelim) = checkSepHint(stripBom(sample).$1);
  if (sepDelim != null) return sepDelim;

  final lines = _sampleLines(stripped);
  if (lines.isEmpty) return ',';

  var bestCandidate = ',';
  var bestUniform = false;
  var bestMinCount = 0;

  for (final candidate in _candidates) {
    var minCount = -1;
    var maxCount = 0;
    var qualifies = true;

    for (final line in lines) {
      final count = _countOutsideQuotes(line, candidate);
      if (count == 0) {
        qualifies = false;
        break;
      }
      if (minCount < 0 || count < minCount) minCount = count;
      if (count > maxCount) maxCount = count;
    }

    if (!qualifies) continue;
    final uniform = minCount == maxCount;

    final better =
        bestMinCount == 0 ||
        (uniform && !bestUniform) ||
        (uniform == bestUniform && minCount > bestMinCount);
    if (better) {
      bestCandidate = candidate;
      bestUniform = uniform;
      bestMinCount = minCount;
    }
  }

  return bestCandidate;
}