Der Prozess würde wie folgt sein:
- eröffnen
StreamWriter
in eine temporären Datei.
- Öffnen Sie eine
StreamReader
in der Zieldatei.
- Für jede Zeile:
- Split der Text in Spalten auf einem Trennzeichen basiert.
- die Spalten für die Werte überprüfen Sie ersetzen möchten, und sie ersetzen.
- Verbinden Sie die Spaltenwerte wieder zusammen Ihre Trennzeichen verwendet.
- Schreiben Sie die Zeile in die temporäre Datei.
- Wenn Sie fertig sind, löschen Sie die Zieldatei und verschieben Sie die temporäre Datei in den Zieldateipfad.
Hinweis in Bezug auf die Schritte 2 und 3.1: Wenn Sie in der Struktur der Datei sicher sind, und es ist einfach genug, Sie all dies aus der Box, wie tun kann (Ich werde eine Probe in einem Moment umfassen). Es gibt jedoch Faktoren in einer CSV-Datei, die Aufmerksamkeit benötigen (z. B. wenn ein Trennzeichen in einem Spaltenwert verwendet wird). Sie können sich selbst durchprobieren, oder versuchen Sie eine existing solution.
Grund Beispiel nur StreamReader
und StreamWriter
mit:
var sourcePath = @"C:\data.csv";
var delimiter = ",";
var firstLineContainsHeaders = true;
var tempPath = Path.GetTempFileName();
var lineNumber = 0;
var splitExpression = new Regex(@"(" + delimiter + @")(?=(?:[^""]|""[^""]*"")*$)");
using (var writer = new StreamWriter(tempPath))
using (var reader = new StreamReader(sourcePath))
{
string line = null;
string[] headers = null;
if (firstLineContainsHeaders)
{
line = reader.ReadLine();
lineNumber++;
if (string.IsNullOrEmpty(line)) return; // file is empty;
headers = splitExpression.Split(line).Where(s => s != delimiter).ToArray();
writer.WriteLine(line); // write the original header to the temp file.
}
while ((line = reader.ReadLine()) != null)
{
lineNumber++;
var columns = splitExpression.Split(line).Where(s => s != delimiter).ToArray();
// if there are no headers, do a simple sanity check to make sure you always have the same number of columns in a line
if (headers == null) headers = new string[columns.Length];
if (columns.Length != headers.Length) throw new InvalidOperationException(string.Format("Line {0} is missing one or more columns.", lineNumber));
// TODO: search and replace in columns
// example: replace 'v' in the first column with '\/': if (columns[0].Contains("v")) columns[0] = columns[0].Replace("v", @"\/");
writer.WriteLine(string.Join(delimiter, columns));
}
}
File.Delete(sourcePath);
File.Move(tempPath, sourcePath);
in einem solchen Fall, warum Sie nicht Hadoop Karte reduzieren Versuchen Sie es mit .... –
Sie können werden Änderungen nur möglich, wenn modifizierte Leitungslänge haben, die nicht original Zeilenlänge ein –
Warum nicht einfach schreiben überschreitet neue Datei? Also: 1. Lesen 2. Ändern 3. Zu kopieren. Ist das etwas, das du nicht tun willst, oder suchst du nur nach einem "eleganten" Weg, dies zu tun? – StampedeXV