2012-04-25 3 views
1

Je suis en train de convertir par lots un certain nombre de fichiers CSV présent encodage UTF-8 à .NETOuvrez un fichier CSV via le bloc-notes et convertissez-le en UTF-8 dans .NET?

Ce que je fais jusqu'à présent est d'ouvrir le fichier csv un par un et en sélectionnant « tous les fichiers » de la "save as/format type" liste déroulante et en sélectionnant l'encodage comme "UTF-8" de nouveau dans la liste déroulante ci-dessous et puis je l'enregistre (il ne demande pas de remplacer le fichier original si).

Comme cette procédure est assez fastidieux, je voudrais écrire une petite application pour en vb.NET

Tout ce que je suis venu avec est la suivante: System.Text.Encoding.Convert(System.Text.Encoding.ASCII,System.Text.Encoding.UTF-8)

Mais c'est la création d'une erreur :(

Toutes les suggestions Thx

MISE à jOUR: juste mis à jour ma question à utiliser lib/funcs internes de .NET au lieu d'utiliser le Bloc-notes: D

+2

Suggestion: Skip Bloc-notes, utilisez le codage des fonctions de conversion disponibles dans .NET. – deceze

+0

@deceze mais ce ne sera pas un peu d'expérimentation? (J'ai lu quelque part sur Internet que .NET n'est parfois pas capable de reconnaître le bon jeu d'encodage/nomenclature à moins qu'une tierce partie lib soit utilisée comme iconv) Juste pour être du côté plus sûr Je veux coller avec le bloc-notes: D – gunther

+1

n'automatise pas le bloc-notes avec .net. Soit faire l'encodage entièrement en .NET (selon deceze) ou peut-être que vous pourriez envisager d'automatiser avec AutoHotkey à la place. Il vous permettra d'enregistrer une macro de clics du clavier et de la souris, puis de le rejouer. – GregHNZ

Répondre

0

Essayez this: Mozilla's charset detector ou .NET port of it.
OU
Here vous pouvez trouver d'autres façons les gens l'ont fait.

EDIT: OU adapter/utiliser this

using System; 
using System.Data; 
using System.IO; 
using System.Text; 


public partial class Converting : System.Web.UI.Page 

{ 
    protected void Page_Load(object sender, EventArgs e) 

    { 


     string sourceDir = "C:\\test"; 

     string newDir = "C:\\test2"; 

     foreach (String sourceFile in System.IO.Directory.GetFiles(sourceDir)) 

     { 
      char[] splitter = { '\\' }; 



      String[] str = sourceFile.Split(splitter); 
      String fname = str[str.Length - 1]; 


      FileStream fs = new FileStream(sourceFile, FileMode.Open, FileAccess.ReadWrite); 

      StreamReader ReadFile = new StreamReader(fs, System.Text.Encoding.ASCII); 

      FileStream fs1 = new FileStream(newDir + 
"\\new_" + fname, FileMode.OpenOrCreate, FileAccess.Write); 
      StreamWriter WriteFile = new StreamWriter(fs1, System.Text.Encoding.UTF8); 

      String strLine; 
      while (ReadFile != null) 

      { 
       strLine = ReadFile.ReadLine(); 
       //MessageBox.Show(strLine); 
       if (strLine != null) 
       { 
        WriteFile.WriteLine(strLine); 
       } 
       else 
       { 
        ReadFile.Close(); 
        ReadFile = null; 
        WriteFile.Close(); 
       } 
      } 
     } 
    } 
} 
+0

Thx mais en plus d'être un noob je voudrais aller avec des moyens simples qui fait juste le travail (pas de mal à cela ... droit?: D). – gunther

+0

btw thx pour me fournir le lien de la façon dont les autres ont fait la même chose de différentes manières; utile :) – gunther

+0

Vous êtes les bienvenus, a également trouvé un exemple pour ASP.NET qui devrait être quelque peu similaire: http://forums.asp.net/t/1173381.aspx/1 –

0

Jetez un oeil à DirectoryInfo pour l'énumération des fichiers dans un répertoire.

Ensuite, regardez File.ReadAllText() et File.WriteAllText() qui sont des méthodes pratiques que vous pouvez facilement utiliser pour convertir les encodages.

Notez que si vous voulez UTF-8 sans signature au début du fichier (U + FEFF) vous devez créer votre encodage avec

var encoding = new UTF8Encoding(false); 
+0

Thx pour répondre :) Eh bien, je n'ai certainement aucune idée de la signature au début du fichier CSV mais j'ai lu un peu sur BOM. Est-ce ce que vous essayez de mettre ici? : | En outre, y aura-t-il une différence pratique par rapport au fichier converti manuellement en utilisant le Bloc-notes et celui utilisant la procédure .NET en utilisant "System.Text.Encoding"? Tels que l'espacement de ligne/char, la nouvelle ligne etc.? – gunther

+0

La signature est en effet la nomenclature. – RvdK

+0

Informations vraiment utiles beaucoup beaucoup :) – gunther

0

Si c'est un coup, lancez PowerShell :

gci *.csv | %{ Get-Content $_ | Set-Content -Encoding UTF8 "$($_.BaseName)_Encoded.csv" } 

DCG * .csv: obtenir tous les fichiers csv dans le répertoire courant et conduit le résultat à une boucle "foreach" (%) Get-Content de chaque fichier, puis conduit le résultat Set-Content que fait la conversion UTF8 et stocke le résultat dans un fichier ayant le même nom de base, postfixé avec "_Encode ré".

+0

Thx pour le tir: D mais environnement Windows seulement no * nix (Je souhaitais que ce soit * nix car il y a presque des zillions d'articles/messages sur comment le faire en * nix :) mais malheureusement pas en windows) – gunther

+0

PowerShell est pour Windows :-) http: // fr. wikipedia.org/wiki/Windows_PowerShell –

+0

Génial! mais est-ce que cela convertira tous les fichiers dans le répertoire actuel? Je voulais faire une conversion par lots. Comment puis-je le faire fonctionner en boucle pour tous les fichiers présents dans le répertoire courant? – gunther

Questions connexes