Benutzer mit den meisten Antworten
Ausgabe in eine Textdatei

Frage
-
Hallo.
Ich habe ein bestehendes Programm was funktioniert. Es liest Barcodes auf Bilddateien aus und Speichert diese in seperate Textdateien.
Wie muss ich den Code ergänzen, damit das Programm alles nur in einer Textdatei speichert und in folgender Reihenfolge:
Dateiname_Barcode
Dateiname_Barcode
.
.
.
der entsprechende Code sieht so aus:
if (barcodes.Count > 0) { // Schreiben der Barcodes string ausgabeDatei = Path.Combine(this.ZielPfad, Path.GetFileNameWithoutExtension(dateiName) + this.AusgabeErweiterung); File.WriteAllLines(ausgabeDatei, barcodes.Cast<string>(), Encoding.Default); Console.WriteLine("'{0}' Barcodes erkannt.", barcodes.Count); return true; } else { Console.WriteLine("keine Barcodes erkannt.", barcodes.Count); }
Danke
Grüße
Marius
Antworten
-
Hallo Stefan,
also ich bin (noch) blutinger Anfänger. Ein freundlicher User hier im Forum hat mit den Code vor 2 Wochen zur Verfügung gestellt. Ich verstehe den Code so langsam, aber ihn erweitern, wie Frank es unten schildert (was bestimmt funktioniert) ist für mich z.Z. unmöglich. Ich schreibe mal den kompletten Code...Vielleicht kannst Du mir dann besser helfen.
using System; using System.Collections; using System.Drawing; using System.IO; using System.Linq; using System.Text; namespace BarcodeScannen { /// <summary> /// Einfache Klasse zum Erkennen von Barcodes auf Basis von http://www.codeproject.com/KB/graphics/BarcodeImaging3.aspx /// </summary> class Scannen { public Scannen(String quellPfad, String zielPfad) { this.QuellPfad = quellPfad; this.ZielPfad = zielPfad; this.Erweiterungen = new String[] { ".jpg", ".png", ".tif" }; } /// <summary>Das Quell-Verzeichnis (mit den Bitmaps).</summary> public string QuellPfad { get; set; } /// <summary>Das Ziel-Verzeichnis (verarbeitete Bitmaps und Text-Ausgabe).</summary> public string ZielPfad { get; set; } /// <summary>Die Erweiterungen (Bitmap-Formate).</summary> public string[] Erweiterungen { get; set; } /// <summary>Erweiterung für die Ausgabe.</summary> public string AusgabeErweiterung { get { return ".txt"; } } /// <summary>Anzahl der Scan-Vorgänge (Optimum?).</summary> public int AnzahlScans { get { return 100; } } /// <summary>Zu scannende Barcode-Typen (Alle?).</summary> public BarcodeImaging.BarcodeType BarcodeType { get { return BarcodeImaging.BarcodeType.All; } } public void Verarbeiten() { // Argumente prüfen if (!ArgumentePrüfen()) return; var quellDateien = from datei in Directory.EnumerateFiles(this.QuellPfad, "*.*", SearchOption.TopDirectoryOnly) from erweiterung in this.Erweiterungen let endung = Path.GetExtension(datei) where endung.Equals(erweiterung, StringComparison.OrdinalIgnoreCase) select datei; /* oder var quellDateien = from datei in Directory.EnumerateFiles(this.QuellPfad, "*.*", SearchOption.TopDirectoryOnly) let endung = Path.GetExtension(datei) where this.Erweiterungen.Any(erweiterung => endung.Equals(erweiterung, StringComparison.OrdinalIgnoreCase)) select datei; */ string dateiName = "ausgabeDateiName";
string ausgabeDatei = Path.Combine(this.ZielPfad, dateiName + this.AusgabeErweiterung);
using (StreamWriter sw = File.CreateText(ausgabeDatei))
{ foreach (var quellDatei in quellDateien) { try {
// Wenn zu verarbeiten, wird die Datei verschoben string zielDatei = Path.Combine(this.ZielPfad, Path.GetFileName(quellDatei));
ArrayList barcodes = DateiScannen(quellDatei);
if (barcodes != null) { if (quellDatei != zielDatei) { File.Move(quellDatei, zielDatei);
}
// Schreiben der Barcodes
foreach (var bc in barcodes)
{
sw.WriteLine(String.Format("{0}_{1}", Path.GetFileName(quellDatei), bc.ToString()));
}
} } catch (Exception exception) { Console.Error.WriteLine("Fehler bei der Verabeitung von '{0}':\r\n{1}", quellDatei, exception.Message); }
}
} } /// <summary>Verarbeitet eine Datei (Bitmap)</summary> private ArrayList DateiScannen(string dateiName) { ArrayList barcodes = null;
// Datei als Bitmap laden using (Bitmap bitmap = (Bitmap)Bitmap.FromFile(dateiName)) { Console.Write("Scanne: '{0}' ... ", dateiName); barcodes = new ArrayList(); BarcodeImaging.FullScanPage(ref barcodes, bitmap, this.AnzahlScans); // Barcodes erkannt? if (barcodes.Count > 0) { Console.WriteLine("'{0}' Barcodes erkannt in Datei {1}.", barcodes.Count, dateiName);
} else { Console.WriteLine("keine Barcodes erkannt in Datei {0}.", dateiName);
barcodes = null;
} } return barcodes; } /// <summary>Eine (sehr einfache) Prüfung der Argumente.</summary> /// <returns><c>true</c>, wenn die Argumente vollständig sind, sonst <c>false</c>.</returns> private bool ArgumentePrüfen() { bool ok = true; if (!Directory.Exists(this.QuellPfad)) { Console.Error.WriteLine("Das Quellverzeichnis '{0}' ist nicht vorhanden.", this.QuellPfad); ok = false; } if (!Directory.Exists(this.ZielPfad)) { Console.Error.WriteLine("Das Zielverzeichnis '{0}' ist nicht vorhanden.", this.ZielPfad); ok = false; } if (this.Erweiterungen == null || this.Erweiterungen.Length == 0) { Console.Error.WriteLine("Es sind keine Dateierweiterungen angegeben."); ok = false; } else { foreach (var erweiterung in this.Erweiterungen) { if (erweiterung == null || erweiterung.Length == 0 || !erweiterung.StartsWith(".")) { Console.Error.WriteLine("Die Dateierweiterung '{0}' ist ungültig.", erweiterung ?? "NULL"); ok = false; } } } return ok; } } }
In der Program.cs wird der Parameter Quellverzeichnis übergeben und die Klasse Scannen.cs gestartet.Danke für die Hilfe
Hallo Marius,
ich habe mal etwas rumgepfuscht in Deinem Programm, so sollte es gehen (ungetestet).
Es gibt an einigen Stellen noch etwas Optimierungspotential, aber im Prinzip sollte es nun so sein, wie du wolltest.
Viel Erfolg...
"It's time to kick ass and chew bubble gum... and I'm all outta gum." - Duke Nukem- Als Antwort markiert Therox_X Freitag, 26. August 2011 14:21
Alle Antworten
-
Hi,
wenn das viele Datensätze werden, solltest Du das eher in eine Datenbank als in eine Datei speichern. Dort kannst Du dann auch problemlos sortieren (bei der Ausgabe).
Dein Code speichert doch nur in eine Datei!? Irgendwo wird ja "dateiName" gesetzt, das dürfte die Stelle sein, die Du suchst (aber nicht im Code oben enthalten ist)
Da Du nicht schreibst, was "barcodes" eigentlich ist, nehme ich mal an, dass eine eine List<string> ist? Falls ja, schau mal hier für die Sortierung:
http://msdn.microsoft.com/de-de/library/b0zbh7b6.aspx
http://msdn.microsoft.com/de-de/library/234b841s.aspx
...
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo Marius,
- Du schriebst: "... damit das Programm alles nur in einer Textdatei speichert ..."
Dann kann man zum Beispiel File.AppendText-Methode benutzen- dann werden die Zeichenketten an die Datei "angehängt".
Oder man benutzt einen StringBuilder, kopiert immer über die Append*** - Methoden (etwa AppendLine) und schreibt dann am Ende mit "File.WriteAllText" (o.ä.) in den Text in die Datei. Vorher sollte man ggf. mit LINQ sortieren:[Sortieren von Daten] [Download C# LINQ Beispiele]
[Exemplarische Vorgehensweise: Schreiben von Abfragen in C# (LINQ)] (suche: orderby, groupby)
(natürlich ginge es auch ohne LINQ etwa mit Array.Sort, List.Sort, o.ä.)
ciao Frank -
Hallo Stefan,
also ich bin (noch) blutinger Anfänger. Ein freundlicher User hier im Forum hat mit den Code vor 2 Wochen zur Verfügung gestellt. Ich verstehe den Code so langsam, aber ihn erweitern, wie Frank es unten schildert (was bestimmt funktioniert) ist für mich z.Z. unmöglich. Ich schreibe mal den kompletten Code...Vielleicht kannst Du mir dann besser helfen.
using System; using System.Collections; using System.Drawing; using System.IO; using System.Linq; using System.Text; namespace BarcodeScannen { /// <summary> /// Einfache Klasse zum Erkennen von Barcodes auf Basis von http://www.codeproject.com/KB/graphics/BarcodeImaging3.aspx /// </summary> class Scannen { public Scannen(String quellPfad, String zielPfad) { this.QuellPfad = quellPfad; this.ZielPfad = zielPfad; this.Erweiterungen = new String[] { ".jpg", ".png", ".tif" }; } /// <summary>Das Quell-Verzeichnis (mit den Bitmaps).</summary> public string QuellPfad { get; set; } /// <summary>Das Ziel-Verzeichnis (verarbeitete Bitmaps und Text-Ausgabe).</summary> public string ZielPfad { get; set; } /// <summary>Die Erweiterungen (Bitmap-Formate).</summary> public string[] Erweiterungen { get; set; } /// <summary>Erweiterung für die Ausgabe.</summary> public string AusgabeErweiterung { get { return ".txt"; } } /// <summary>Anzahl der Scan-Vorgänge (Optimum?).</summary> public int AnzahlScans { get { return 100; } } /// <summary>Zu scannende Barcode-Typen (Alle?).</summary> public BarcodeImaging.BarcodeType BarcodeType { get { return BarcodeImaging.BarcodeType.All; } } public void Verarbeiten() { // Argumente prüfen if (!ArgumentePrüfen()) return; var quellDateien = from datei in Directory.EnumerateFiles(this.QuellPfad, "*.*", SearchOption.TopDirectoryOnly) from erweiterung in this.Erweiterungen let endung = Path.GetExtension(datei) where endung.Equals(erweiterung, StringComparison.OrdinalIgnoreCase) select datei; /* oder var quellDateien = from datei in Directory.EnumerateFiles(this.QuellPfad, "*.*", SearchOption.TopDirectoryOnly) let endung = Path.GetExtension(datei) where this.Erweiterungen.Any(erweiterung => endung.Equals(erweiterung, StringComparison.OrdinalIgnoreCase)) select datei; */ foreach (var quellDatei in quellDateien) { try { // Wenn zu verarbeiten, wird die Datei verschoben string zielDatei = Path.Combine(this.ZielPfad, Path.GetFileName(quellDatei)); if (DateiScannen(quellDatei)) { if (quellDatei != zielDatei) File.Move(quellDatei, zielDatei); } } catch (Exception exception) { Console.Error.WriteLine("Fehler bei der Verabeitung von '{0}':\r\n{1}", quellDatei, exception.Message); } } } /// <summary>Verarbeitet eine Datei (Bitmap)</summary> private bool DateiScannen(string dateiName) { // Datei als Bitmap laden using (Bitmap bitmap = (Bitmap)Bitmap.FromFile(dateiName)) { Console.Write("Scanne: '{0}' ... ", dateiName); var barcodes = new ArrayList(); BarcodeImaging.FullScanPage(ref barcodes, bitmap, this.AnzahlScans); // Barcodes erkannt? if (barcodes.Count > 0) { // Schreiben der Barcodes string ausgabeDatei = Path.Combine(this.ZielPfad, Path.GetFileNameWithoutExtension(dateiName) + this.AusgabeErweiterung); File.WriteAllLines(ausgabeDatei, barcodes.Cast<string>(), Encoding.Default); Console.WriteLine("'{0}' Barcodes erkannt.", barcodes.Count); return true; } else { Console.WriteLine("keine Barcodes erkannt.", barcodes.Count); } } return false; } /// <summary>Eine (sehr einfache) Prüfung der Argumente.</summary> /// <returns><c>true</c>, wenn die Argumente vollständig sind, sonst <c>false</c>.</returns> private bool ArgumentePrüfen() { bool ok = true; if (!Directory.Exists(this.QuellPfad)) { Console.Error.WriteLine("Das Quellverzeichnis '{0}' ist nicht vorhanden.", this.QuellPfad); ok = false; } if (!Directory.Exists(this.ZielPfad)) { Console.Error.WriteLine("Das Zielverzeichnis '{0}' ist nicht vorhanden.", this.ZielPfad); ok = false; } if (this.Erweiterungen == null || this.Erweiterungen.Length == 0) { Console.Error.WriteLine("Es sind keine Dateierweiterungen angegeben."); ok = false; } else { foreach (var erweiterung in this.Erweiterungen) { if (erweiterung == null || erweiterung.Length == 0 || !erweiterung.StartsWith(".")) { Console.Error.WriteLine("Die Dateierweiterung '{0}' ist ungültig.", erweiterung ?? "NULL"); ok = false; } } } return ok; } } }
In der Program.cs wird der Parameter Quellverzeichnis übergeben und die Klasse Scannen.cs gestartet.Danke für die Hilfe
-
Hi,
um die Daten in eine einzige Datei zu schreiben, musst Du eigentlich nur diese Zeile hier ändern:
// Schreiben der Barcodes string ausgabeDatei = Path.Combine(this.ZielPfad, Path.GetFileNameWithoutExtension(dateiName) + this.AusgabeErweiterung);
in
// Schreiben der Barcodes string ausgabeDatei = @"X:\Ordner\Datei.txt";
Damit Du sämtliche Einträge sortiert in die Datei schreiben kannst (bei einem Durchlauf! Nicht bei mehreren Starts der Anwendung) solltest Du dir eine Liste erstellen, die dann immer weiter gefüllt wird. Hierfür kannst Du dann auf Klassenebene ein entsprechendes Objekt erstellen und die einzelnen Ergebnisse in die übergeordnete Liste kopieren.
/// <summary>Liste aller Scanergebisse</summary> public ArrayList Barcodes { get; set; } ... // Barcodes erkannt? if (barcodes.Count > 0) { Barcodes.AddRange( barcodes ); Console.WriteLine("'{0}' Barcodes erkannt.", barcodes.Count); return true; }
Das Schreiben in die Datei erledigst Du dann nach der Beendigung deiner Schleife.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo Stefan,
also ich bin (noch) blutinger Anfänger. Ein freundlicher User hier im Forum hat mit den Code vor 2 Wochen zur Verfügung gestellt. Ich verstehe den Code so langsam, aber ihn erweitern, wie Frank es unten schildert (was bestimmt funktioniert) ist für mich z.Z. unmöglich. Ich schreibe mal den kompletten Code...Vielleicht kannst Du mir dann besser helfen.
using System; using System.Collections; using System.Drawing; using System.IO; using System.Linq; using System.Text; namespace BarcodeScannen { /// <summary> /// Einfache Klasse zum Erkennen von Barcodes auf Basis von http://www.codeproject.com/KB/graphics/BarcodeImaging3.aspx /// </summary> class Scannen { public Scannen(String quellPfad, String zielPfad) { this.QuellPfad = quellPfad; this.ZielPfad = zielPfad; this.Erweiterungen = new String[] { ".jpg", ".png", ".tif" }; } /// <summary>Das Quell-Verzeichnis (mit den Bitmaps).</summary> public string QuellPfad { get; set; } /// <summary>Das Ziel-Verzeichnis (verarbeitete Bitmaps und Text-Ausgabe).</summary> public string ZielPfad { get; set; } /// <summary>Die Erweiterungen (Bitmap-Formate).</summary> public string[] Erweiterungen { get; set; } /// <summary>Erweiterung für die Ausgabe.</summary> public string AusgabeErweiterung { get { return ".txt"; } } /// <summary>Anzahl der Scan-Vorgänge (Optimum?).</summary> public int AnzahlScans { get { return 100; } } /// <summary>Zu scannende Barcode-Typen (Alle?).</summary> public BarcodeImaging.BarcodeType BarcodeType { get { return BarcodeImaging.BarcodeType.All; } } public void Verarbeiten() { // Argumente prüfen if (!ArgumentePrüfen()) return; var quellDateien = from datei in Directory.EnumerateFiles(this.QuellPfad, "*.*", SearchOption.TopDirectoryOnly) from erweiterung in this.Erweiterungen let endung = Path.GetExtension(datei) where endung.Equals(erweiterung, StringComparison.OrdinalIgnoreCase) select datei; /* oder var quellDateien = from datei in Directory.EnumerateFiles(this.QuellPfad, "*.*", SearchOption.TopDirectoryOnly) let endung = Path.GetExtension(datei) where this.Erweiterungen.Any(erweiterung => endung.Equals(erweiterung, StringComparison.OrdinalIgnoreCase)) select datei; */ string dateiName = "ausgabeDateiName";
string ausgabeDatei = Path.Combine(this.ZielPfad, dateiName + this.AusgabeErweiterung);
using (StreamWriter sw = File.CreateText(ausgabeDatei))
{ foreach (var quellDatei in quellDateien) { try {
// Wenn zu verarbeiten, wird die Datei verschoben string zielDatei = Path.Combine(this.ZielPfad, Path.GetFileName(quellDatei));
ArrayList barcodes = DateiScannen(quellDatei);
if (barcodes != null) { if (quellDatei != zielDatei) { File.Move(quellDatei, zielDatei);
}
// Schreiben der Barcodes
foreach (var bc in barcodes)
{
sw.WriteLine(String.Format("{0}_{1}", Path.GetFileName(quellDatei), bc.ToString()));
}
} } catch (Exception exception) { Console.Error.WriteLine("Fehler bei der Verabeitung von '{0}':\r\n{1}", quellDatei, exception.Message); }
}
} } /// <summary>Verarbeitet eine Datei (Bitmap)</summary> private ArrayList DateiScannen(string dateiName) { ArrayList barcodes = null;
// Datei als Bitmap laden using (Bitmap bitmap = (Bitmap)Bitmap.FromFile(dateiName)) { Console.Write("Scanne: '{0}' ... ", dateiName); barcodes = new ArrayList(); BarcodeImaging.FullScanPage(ref barcodes, bitmap, this.AnzahlScans); // Barcodes erkannt? if (barcodes.Count > 0) { Console.WriteLine("'{0}' Barcodes erkannt in Datei {1}.", barcodes.Count, dateiName);
} else { Console.WriteLine("keine Barcodes erkannt in Datei {0}.", dateiName);
barcodes = null;
} } return barcodes; } /// <summary>Eine (sehr einfache) Prüfung der Argumente.</summary> /// <returns><c>true</c>, wenn die Argumente vollständig sind, sonst <c>false</c>.</returns> private bool ArgumentePrüfen() { bool ok = true; if (!Directory.Exists(this.QuellPfad)) { Console.Error.WriteLine("Das Quellverzeichnis '{0}' ist nicht vorhanden.", this.QuellPfad); ok = false; } if (!Directory.Exists(this.ZielPfad)) { Console.Error.WriteLine("Das Zielverzeichnis '{0}' ist nicht vorhanden.", this.ZielPfad); ok = false; } if (this.Erweiterungen == null || this.Erweiterungen.Length == 0) { Console.Error.WriteLine("Es sind keine Dateierweiterungen angegeben."); ok = false; } else { foreach (var erweiterung in this.Erweiterungen) { if (erweiterung == null || erweiterung.Length == 0 || !erweiterung.StartsWith(".")) { Console.Error.WriteLine("Die Dateierweiterung '{0}' ist ungültig.", erweiterung ?? "NULL"); ok = false; } } } return ok; } } }
In der Program.cs wird der Parameter Quellverzeichnis übergeben und die Klasse Scannen.cs gestartet.Danke für die Hilfe
Hallo Marius,
ich habe mal etwas rumgepfuscht in Deinem Programm, so sollte es gehen (ungetestet).
Es gibt an einigen Stellen noch etwas Optimierungspotential, aber im Prinzip sollte es nun so sein, wie du wolltest.
Viel Erfolg...
"It's time to kick ass and chew bubble gum... and I'm all outta gum." - Duke Nukem- Als Antwort markiert Therox_X Freitag, 26. August 2011 14:21