Récemment, j'ai été informé par un de bonne réputation AFIN que l'utilisateur, qui TStringList
a fractionnement des bugs qui serait la cause de l'échec d'analyse des données au format CSV. Je n'ai pas été informé de la nature de ces bugs, et une recherche sur internet, y compris la Qualité de Centrale n'a pas produit tous les résultats, donc je vous demande. Quelles sont TStringList fractionnement des bugs?
Veuillez noter, je ne suis pas intéressé à infondées avis en fonction des réponses.
Ce que je sais:
Pas grand-chose... On est qui, ces bugs se manifestent rarement avec des données de test, mais pas si rarement dans le monde réel.
L'autre est, comme indiqué, ils empêchent une analyse correcte de CSV. Pensant qu'il est difficile de reproduire les bugs avec les données de test, je suis (probablement) la recherche de l'aide de qui ont essayé d'utiliser une chaîne de la liste au format CSV analyseur dans le code de production.
Pertinence des problèmes:
J'ai obtenu de l'information sur un "Delphi XE' tagged question, donc, à défaut de l'analyse en raison du "caractère d'espace étant considéré comme un"séparateur de fonctionnalité ne s'applique pas. Parce que l'introduction de l' StrictDelimiter
de la propriété avec Delphi 2006, a décidé que. Je suis moi-même à l'aide de Delphi 2007.
En outre, depuis la liste des chaînes ne peuvent détenir que des chaînes, il est seulement chargé de la séparation des champs. Toute conversion les difficultés rencontrées par les valeurs de champ (f.j'. date, les nombres à virgule flottante..) découlant de paramètres régionaux différences etc. ne sont pas dans le champ d'application.
Règles de base:
Il n'y a pas de spécification standard pour CSV. Mais il y a des règles de base déduit à partir de diverses spécifications.
Ci-dessous est une démonstration de la façon dont TStringList gère ces. La règle et l'exemple des chaînes sont de Wikipédia. Crochets ([
]
) sont superposées autour de chaînes de caractères pour être en mesure de voir ou les espaces de fin (le cas échéant) par le code de test.
Les espaces sont considérés comme faisant partie d'un domaine et ne doit pas être ignoré.
Chaîne de Test: [1997, Ford E350] Articles: [1997] [ Ford ] [ E350]
Les champs avec des virgules incorporées doit être entourée de guillemets doubles.
Chaîne de Test: [1997,Ford E350,"Super, luxe camion"] Articles: [1997] [Ford] [E350] [Super, luxe camion]
Domaines intégré dans le double-guillemets doit être entourée de guillemets doubles, et chacun de l'embarqué, les guillemets doubles doit être représenté par une paire de guillemets doubles.
Chaîne de Test: [1997,Ford E350,"Super", "luxe"" camion"] Articles: [1997] [Ford] [E350] [Super, "de luxe" camion]
Les champs insérés les sauts de ligne doit être entourée de guillemets doubles.
Chaîne de Test: [1997,Ford E350,"Aller en obtenir un maintenant ils vont vite"] Articles: [1997] [Ford] [E350] [Aller à en obtenir un maintenant ils vont vite]
En CSV implémentations de garniture de pointe ou les espaces, les champs avec ces espaces doivent être placés à l'intérieur de guillemets doubles.
Chaîne de Test: [1997,Ford E350," Super luxe camion "] Articles: [1997] [Ford] [E350] [ Super luxueux camion ]
Les champs peuvent toujours être entourée de guillemets doubles, si nécessaire ou pas.
Chaîne de Test: ["1997","Ford","E350"] Articles: [1997] [Ford] [E350]
Test de code:
var
SL: TStringList;
rule: string;
function GetItemsText: string;
var
i: Integer;
begin
for i := 0 to SL.Count - 1 do
Result := Result + '[' + SL[i] + '] ';
end;
procedure Test(TestStr: string);
begin
SL.DelimitedText := TestStr;
Writeln(rule + sLineBreak, 'Test string: [', TestStr + ']' + sLineBreak,
'Items: ' + GetItemsText + sLineBreak);
end;
begin
SL := TStringList.Create;
SL.Delimiter := ','; // default, but ";" is used with some locales
SL.QuoteChar := '"'; // default
SL.StrictDelimiter := True; // required: strings are separated *only* by Delimiter
rule := 'Spaces are considered part of a field and should not be ignored.';
Test('1997, Ford , E350');
rule := 'Fields with embedded commas must be enclosed within double-quote characters.';
Test('1997,Ford,E350,"Super, luxurious truck"');
rule := 'Fields with embedded double-quote characters must be enclosed within double-quote characters, and each of the embedded double-quote characters must be represented by a pair of double-quote characters.';
Test('1997,Ford,E350,"Super, ""luxurious"" truck"');
rule := 'Fields with embedded line breaks must be enclosed within double-quote characters.';
Test('1997,Ford,E350,"Go get one now'#10#13'they are going fast"');
rule := 'In CSV implementations that trim leading or trailing spaces, fields with such spaces must be enclosed within double-quote characters.';
Test('1997,Ford,E350," Super luxurious truck "');
rule := 'Fields may always be enclosed within double-quote characters, whether necessary or not.';
Test('"1997","Ford","E350"');
SL.Free;
end;
Si vous avez tout lu, la question était :), quelles sont les "TStringList fractionnement des bugs?"