2016-08-05 13 views
0

ich eine Textdatei zu lesen, die können Saibling aus folgenden Sprachen enthalten: Englisch, Japanisch, Chinesisch, Französisch, Spanisch, Deutsch, Italienischmehrsprachige Textdatei in C# Lesen

Meine Aufgabe einfach ist, die Daten zu lesen, und schreibe es in eine neue Textdatei (Platzieren einer neuen Zeile char \n nach 100 Zeichen).

Ich kann File.ReadAllText und File.ReadAllLines nicht verwenden, da die Dateigröße mehr als 500 MB betragen kann. So habe ich geschrieben folgenden Code:

using (var streamReader = new StreamReader(inputFilePath, Encoding.ASCII)) 
{ 
     using (var streamWriter = new StreamWriter(outputFilePath,false)) 
     { 
      char[] bytes = new char[100]; 
      while (streamReader.Read(bytes, 0, 100) > 0) 
      { 
       var data = new string(bytes); 
       streamWriter.WriteLine(data); 
      } 
      MessageBox.Show("Compleated"); 
     } 
} 

Anders als ASCII Codierung habe ich versucht UTF-7, UTF-8, UTF-32 und IBM500. Aber kein Glück beim Lesen und Schreiben von mehrsprachigen Zeichen.

Bitte helfen Sie mir, dies zu erreichen.

+0

Die Sprache spielt keine Rolle (wenn Sie wirklich Zeichen, aka Symbole zählen müssen). Was ist Kodierung, wie werden diese speziellen Zeichen gespeichert? Wenn die Kodierung 8-Bit verwendet, um ein Zeichen (ASCII) darzustellen, dann ist Ihr Ansatz in Ordnung, weil das Lesen von 100 Bytes gleich dem Lesen von 100 Zeichen ist: fügen Sie einfach '\ n''nach dem Schreiben jedes Teils hinzu. Andernfalls ([variable-length encoding] (https://en.wikipedia.org/wiki/Variable-width_encoding)) sind Sie in der Tat in Schwierigkeiten, Sie müssen wissen/[Kodierung erkennen] (http://stackoverflow.com/q/4520184/1997232). – Sinatr

+0

Sie müssen herausfinden, wie der Text codiert ist. Wenn die Datei asiatische und westliche Sprachen enthält, ist dies wahrscheinlich Unicode, Big Endian Unicode oder UTF32. Hoffentlich beginnt die Datei mit einem Kodierungsindikator, wie in der Antwort von Christian Jäger gezeigt. Oder es könnte eine Mischung aus Codierungen sein, in diesem Fall müssen Sie herausfinden, wie die Datei strukturiert ist. Es ist sogar möglich, dass Sie den Text untersuchen und die Kodierung ableiten müssen, was überhaupt nicht trivial ist. –

+0

Eine Option besteht darin, sie "zurückzusenden", wenn sie nicht mit einer Kodierung gemäß Spezifikation, Konvention oder Standard geliefert wird. Das Erkennen von Kodierungen ist ein Maß für den letzten Ausweg. –

Antwort

0

Sie müssen sich die ersten 4 Bytes der zu analysierenden Datei ansehen. Diese Bytes geben Ihnen einen Hinweis darauf, welche Kodierung Sie verwenden müssen.

ist hier eine Hilfsmethode ich geschrieben habe, die Aufgabe zu tun:

public static string GetStringFromEncodedBytes(this byte[] bytes) { 
    var encoding = Encoding.Default; 
    var skipBytes = 0; 
     if (bytes[0] == 0x2b && bytes[1] == 0x2f && bytes[2] == 0x76) { 
      encoding = Encoding.UTF7; 
      skipBytes = 3; 
     } 
     if (bytes[0] == 0xef && bytes[1] == 0xbb && bytes[2] == 0xbf) { 
      encoding = Encoding.UTF8; 
      skipBytes = 3; 
     } 

     if (bytes[0] == 0xff && bytes[1] == 0xfe) { 
      encoding = Encoding.Unicode; 
      skipBytes = 2; 
     } 

     if (bytes[0] == 0xfe && bytes[1] == 0xff) { 
      encoding = Encoding.BigEndianUnicode; 
      skipBytes = 2; 
     } 
     if (bytes[0] == 0 && bytes[1] == 0 && bytes[2] == 0xfe && bytes[3] == 0xff) { 
      encoding = Encoding.UTF32; 
      skipBytes = 4; 
     } 


     return encoding.GetString(bytes.Skip(skipBytes).ToArray()); 
    } 
+0

helfen sollte, wie dies Char von Englisch Japanisch Chinesisch Französisch Spanisch Deutsch Italienisch –

+0

Es wird nicht mit bestimmten Zeichen umgehen, wird es Ihnen die Codierung der gesamten Datei sagen. Wenn Sie einen Bytestrom mit gemischten Codierungen haben, müssen Sie prüfen, ob im Stream ein Codierungsstart vorliegt, und den Rest des Streams (bis zur nächsten Codierung) mit der erkannten Codierung behandeln. Wenn die Datei, die Sie lesen, eine komplette Mischung von Sprachen ohne Erklärung der verwendeten Kodierung ist, tut mir leid, ich werde keine Hilfe geben –

+0

Obwohl dies wahrscheinlich notwendig sein wird, um die Kodierung der Datei zu erkennen, ist es keine vollständige Antwort seit Es zeigt nicht, wie der Rest der Datei gelesen wird. Das ist wahrscheinlich der Grund, warum jemand es abgelehnt hat. Ziemlich einfach, ein Beispiel hinzuzufügen, wie Sie die ganze Datei mit diesem Ansatz lesen würden. –

-1

Dies ist ein gut genug beginnen, um die Antwort zu bekommen. Wenn i nicht gleich 100 ist, müssen Sie mehr Zeichen lesen. Keine Probleme mit französischen Zeichen wie é - sie werden alle in der C# Char Klasse behandelt.

char[] soFlow = new char[100]; 
int posn = 0; 
using (StreamReader sr = new StreamReader("a.txt")) 
    using (StreamWriter sw = new StreamWriter("b.txt", false)) 
     while(sr.EndOfStream == false) 
     { 
      try { 
      int i = sr.Read(soFlow, posn%100, 100); 
      //if i < 100 need to read again with second char array 
      posn += 100; 
      sw.WriteLine(new string(soFlow)); 
      } 
      catch(Exception e){Console.WriteLine(e.Message);} 
     } 

Spec: Read (char [], Int32, Int32) Liest einen spezifizierten Maximal von Zeichen aus dem aktuellen Strom in einem Puffer bei dem angegebenen Index beginnt.

Sicher funktioniert für mich sowieso :)