was ich im Grunde versuche zu tun ist, zwei riesige Textdateien zu vergleichen und wenn sie übereinstimmen schreiben eine Zeichenfolge, ich habe dies geschrieben, aber es ist extrem langsam. Ich hatte gehofft, dass ihr vielleicht eine bessere Idee habt. Im folgenden Beispiel ich vergleiche sammeln [3] splitfound [0]den Inhalt von zwei riesigen Textdateien schnell zu vergleichen
string[] collectionlist = File.ReadAllLines(@"C:\found.txt");
string[] foundlist = File.ReadAllLines(@"C:\collection_export.txt");
foreach (string found in foundlist)
{
string[] spltifound = found.Split('|');
string matchfound = spltifound[0].Replace(".txt", ""); ;
foreach (string collect in collectionlist)
{
string[] splitcollect = collect.Split('\\');
string matchcollect = splitcollect[3].Replace(".txt", "");
if (matchcollect == matchfound)
{
end++;
long finaldest = (start - end);
Console.WriteLine(finaldest);
File.AppendAllText(@"C:\copy.txt", "copy \"" + collect + "\" \"C:\\OUT\\" + spltifound[1] + "\\" + spltifound[0] + ".txt\"\n");
break;
}
}
}
Sorry für die Unbestimmtheit Jungs,
Was ich versuche ist einfach zu tun, sagen, wenn der Inhalt von einer Datei in existiert ein anderer schreibt eine Zeichenkette aus (die Zeichenkette ist nicht wichtig, lediglich die Zeit, um die beiden Vergleiche zu finden). Sammelliste ist wie folgt:
Apfel | Farm
foundlist ist wie folgt
C: \ Kuh \ Pferd \ turtle.txt
C: \ Kuh \ Schwein \ apple.txt
was ich bin Dabei wird Apfel aus der Sammelliste genommen und die Zeile gefunden, die Apfel in der Foundlist enthält. Dann schreiben Sie eine grundlegende Windows-Kopie Batch-Datei. Entschuldigung für die Verwirrung.
Antwort (Alle Kredite zu Slaks)
string[] foundlist = File.ReadAllLines(@"C:\found.txt");
var collection = File.ReadLines(@"C:\collection_export.txt")
.ToDictionary(s => s.Split('|')[0].Replace(".txt",""));
using (var writer = new StreamWriter(@"C:\Copy.txt"))
{
foreach (string found in foundlist)
{
string[] splitFound = found.Split('\\');
string matchFound = Path.GetFileNameWithoutExtension(found);
string collectedLine;
if (collection.TryGetValue(matchFound,out collectedLine))
{
string[] collectlinesplit = collectedLine.Split('|');
end++;
long finaldest = (start - end);
Console.WriteLine(finaldest);
writer.WriteLine("copy \"" + found + "\" \"C:\\O\\" + collectlinesplit[1] + "\\" + collectlinesplit[0] + ".txt\"");
}
}
}
Ihres Code scheint es viel mehr als ein einfacher Textvergleich zu tun, und wenn diese wirklich große Dateien sind, dann 'ReadAllLines' scheitern würde mit einem out- von Speicherfehler. Wie groß sind die Dateien? Blättern Sie? –
Eins ist ungefähr 1 Millionen Zeilen und das andere ist ungefähr 200k –
Wenn die 2 Text-Dateien eine unterschiedliche Anzahl von Zeilen haben, dann werden sie nie identisch/übereinstimmen, werden sie? –