2010-06-29 5 views
2

J'ai une valeur de chaîne lue à partir d'un fichier CSV. Le fichier CSV contient 7 NULL octets, je l'ai confirmé en l'ouvrant dans un éditeur hexadécimal et je suis sûr qu'il y a 7 0x0 octets dedans. Cette chaîne me cause de la douleur.VB.NET - chaîne de valeurs nulles

En vb.net lorsque je vérifie le strlen de cette chaîne il renvoie une valeur de 7 et si je fais un String.IsNullOrWhitespace il renvoie false.

Je ne comprends pas pourquoi c'est? J'ai divisé la chaîne en un tableau d'octets et chaque octet est 0x0, qui est null/rien. Une comparaison string = Nothing échoue également. Je veux être en mesure de remplacer cette chaîne par une chaîne de mes propres mais je ne peux pas le faire dynamiquement. Des suggestions pour lesquelles cette chaîne renvoie une longueur de 7 même si chaque octet est 0x0?

+0

Un exemple de votre code serait utile. –

Répondre

3

Le caractère nul n'est pas des espaces, et la référence de votre chaîne n'est pas rien, donc j'attendre String.IsNullOrWhitespace() à retourner faux

+0

Donc, si c'est le cas, comment puis-je vérifier une chaîne de caractères NULL? – WizardsSleeve

+0

Vous devez soit les convertir en "autre chose", par exemple en utilisant 'yourstring = yourstring.Replace (Chr (0)," "c)' pour convertir en espaces ou itérer sur la chaîne et vérifier vous-même –

1

vérifie IsNullEmptyOrWhitespace si la variable elle-même est nulle, pas si la chaîne contient des caractères NULL. Un caractère NULL n'est pas un espace. Donc, cette vérification échoue également.

Je vous suggère d'utiliser un Trim(), après le test. En C# cela ressemblera:

bool MyNullCheck(string s) { 
    if (s == null) return false; 
    s = s.Trim(new string(char.ConvertFromUtf32(0), 1)); 
    return string.IsNullEmptyOrWhiteSpace(s); 
} 

Essayez de convertir en VB (non vérifié)

Function MyNullCheck(s as String) as Boolean 
    If s Is Nothing Then 
    Return False 
    End If 
    s = s.Trim(New String(vbNullChar, 1)) 
    Return String.IsNullEmptyOrWhiteSpace(s) 
End Function 
4

Malheureusement, les null caractère sept fois n'est pas une chaîne vide, ou une chaîne vide. Rappelez-vous que dans .NET une chaîne est à un certain niveau pointer à un tableau de caractères. Une chaîne est nulle si ce pointeur est défini sur null. Une chaîne est vide si le pointeur pointe vers un tableau de longueur nulle. Dans ce cas, le pointeur pointe sur une longueur de sept tableaux de caractères nuls (l'octet étant tous des zéros).

Null Chaîne

A ->

Chaîne vide

A ->()

Votre chaîne

A -> ((0) (0) (0) (0) (0) (0) (0))

Vous pouvez tester ce caractère nul en utilisant

char nullChar = char.ConvertFromUtf32(0); 
string nullCharString = new String(nullChar); 
bool hasNullChar = A.Contains(nullCharString); 
1

Un caractère avec le code de caractère zéro est un caractère comme tout autre. Si vous avez une chaîne de sept caractères, la longueur est sept. Le caractère NUL n'est pas un caractère d'espace blanc et une chaîne contenant des caractères NUL n'est pas identique à une référence de chaîne null (Nothing).

Vous pouvez utiliser la méthode Trim (ou TrimEnd) pour supprimer les caractères NUL en spécifiant qu'il doit couper les caractères NUL: str = str.Trim(Chr(0)), mais je pense que vous devriez plutôt vous demander pourquoi il y a des caractères NUL dans la chaîne pour commencer .

Lisez-vous correctement les données du fichier? Une erreur courante consiste à utiliser la méthode Read pour lire à partir d'un flux, mais en ignorant sa valeur de retour et finissant ainsi avec un tampon seulement partiellement rempli de données du flux. Comme un tableau d'octets est rempli avec des zéros lorsque vous le créez, les octets non définis par l'opération Read restent à zéro et deviennent des caractères NUL lorsque vous décodez les données dans une chaîne.

+0

La chaîne vient d'une autre sortie de programmes sur laquelle je n'ai aucun contrôle. Je le lis correctement car j'ai vérifié le contenu du fichier en utilisant un éditeur hexadécimal. – WizardsSleeve

+0

@WizardsSleeve: Ok, si vous êtes sûr de pouvoir ignorer les caractères NUL en toute sécurité, vous pouvez simplement les couper de la chaîne. Si la chaîne ne contient que des caractères NUL, vous vous retrouvez avec une chaîne vide après cela. – Guffa

0
  • Une chaîne null est une qui n'a pas été initialisé ou qui a été fixé à Nothing.
  • Un vide chaîne est celle qui contient la chaîne vide String.Empty ou "".
  • Les caractères espaces sont espace, tabulation, retour à la ligne, retour chariot et lots more. Mais pas le caractère nul.
  • Votre chaîne n'est ni vide, ni Nothing. Il contient 7 caractères, chacun est le caractère nul - ce n'est donc pas un espace.

Vous pouvez utiliser String.Replace pour supprimer les caractères zéro? Quelque chose comme ça

s = s.Replace(vbNullChar, "") 
0

Je parie que vous avez rencontré un problème d'encodage. Essayez de lire le fichier comme UTF-16