J'ai une routine C # qui importe les données d'un fichier CSV, les compare à une base de données, puis les réécrit dans un fichier. Le fichier source semble contenir quelques caractères non-ASCII qui encrassent la routine de traitement.
J'ai déjà une méthode statique à travers laquelle j'exécute chaque champ d'entrée, mais elle effectue des vérifications de base, telles que la suppression de virgules et de guillemets. Est-ce que quelqu'un sait comment je pourrais ajouter une fonctionnalité qui supprime également les caractères non-ASCII?
string sOut = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(s))
Voici une solution simple:
public static bool IsASCII(this string value)
{
// ASCII encoding replaces non-ascii with question marks, so we use UTF8 to see if multi-byte sequences are there
return Encoding.UTF8.GetByteCount(value) == value.Length;
}
source: http://snipplr.com/view/35806/
Faire tout à la fois
public string ReturnCleanASCII(string s)
{
StringBuilder sb = new StringBuilder(s.Length);
foreach(char c in s)
{
if((int)c > 127) // you probably don't want 127 either
continue;
if((int)c < 32) // I bet you don't want control characters
continue;
if(c == ',')
continue;
if(c == '"')
continue;
sb.Append(c);
}
return sb.ToString();
}
Si vous voulez tester un personnage spécifique, vous pouvez utiliser
if ((int)myChar <= 127)
Obtenir juste le codage ASCII de la chaîne ne vous dira pas qu'un caractère spécifique était non-ASCII pour commencer (si vous vous en souciez). Voir MSDN .
Voici une amélioration par rapport à la réponse acceptée:
string fallbackStr = "";
Encoding enc = Encoding.GetEncoding(Encoding.ASCII.CodePage,
new EncoderReplacementFallback(fallbackStr),
new DecoderReplacementFallback(fallbackStr));
string cleanStr = enc.GetString(enc.GetBytes(inputStr));
Cette méthode remplacera les caractères inconnus par la valeur fallbackStr
ou, si fallbackStr
est vide, les omettra complètement. (Notez que enc
peut être défini en dehors de la portée d'une fonction.)
Cela peut sembler étrange qu’il soit accepté d’abandonner le non-ASCII.
Aussi, je recommande toujours l'excellente FileHelpers library pour analyser les fichiers CSV.
public string RunCharacterCheckASCII(string s)
{
string str = s;
bool is_find = false;
char ch;
int ich = 0;
try
{
char[] schar = str.ToCharArray();
for (int i = 0; i < schar.Length; i++)
{
ch = schar[i];
ich = (int)ch;
if (ich > 127) // not ascii or extended ascii
{
is_find = true;
schar[i] = '?';
}
}
if (is_find)
str = new string(schar);
}
catch (Exception ex)
{
}
return str;
}