in src/common/details/named_values/parsers/for_each_token_parser.cs [125:182]
private static bool ParseNonIndexedTsvFile(INamedValueTokens tokens, INamedValues values, string? token, int skip, int index)
{
// --foreach [tsv] @COL-TSV-FILE [skip header] in @TSV-FILE
// --foreach [tsv] [columns] "COL1;COL2" [skip header] in @TSV-FILE
if (token == "tsv") token = tokens.PeekNextToken(skip++);
if (token == "columns") token = tokens.PeekNextToken(skip++);
var skipHeader = false;
if (tokens.PeekNextTokenValue(skip, values) == "skip" && tokens.PeekNextTokenValue(skip + 1, values) == "header")
{
skipHeader = true;
skip += 2;
}
var columns = "";
if (tokens.PeekNextTokenValue(skip, values) == "in")
{
skip++;
columns = tokens.ValueFromToken(token);
token = tokens.PeekNextToken(skip++);
}
else if (token == "in")
{
token = tokens.PeekNextToken(skip++);
}
if (token == null) return false;
var hasHeader = string.IsNullOrEmpty(columns) || skipHeader;
var atFile = token.StartsWith("@");
var isList = !atFile && token.Contains(";");
var isFile = !atFile && !isList && FileHelpers.FileExistsInDataPath(token, values);
if (atFile || isList || isFile)
{
var value = isFile
? FileHelpers.ReadAllText(token, Encoding.Default)
: tokens.ValueFromToken(token)!;
if (isList)
{
hasHeader = false;
value = value.Replace(";", "\n");
}
tokens.SkipTokens(skip);
values.Add($"foreach.{index}.tsv.file", value);
values.Add($"foreach.{index}.tsv.file.has.header", hasHeader ? "true" : "false");
if (!string.IsNullOrEmpty(columns)) values.Add($"foreach.{index}.tsv.file.columns", columns);
index++;
values.Reset("foreach.count", index.ToString());
return true;
}
return false;
}