detectDelimiter method
Detect the most likely field delimiter from a sample string.
Algorithm:
- Check for an Excel
sep=Xhint on the first line. - 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. - Qualifying candidates are ranked by count consistency across
lines, then by column count; ties keep the earlier candidate
(
,before;,\t,|). - 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;
}