Laden...
Avatar #avatar-2491.jpg
uksbi myCSharp.de - Member
IT Manager / Senior Developer Bielefeld Dabei seit 09.02.2007 13 Beiträge

Forenbeiträge von uksbi Ingesamt 13 Beiträge

10.09.2014 - 12:19 Uhr

Hi,

schau dir mal dieses Tutorial an http://johnnycode.com/2013/08/19/using-c-sharp-sqlbulkcopy-to-import-csv-data-sql-server/.

Der TextFieldParser kann auch mit festen Feldlängen umgehen ...


textFieldParser.TextFieldType = FieldType.FixedWidth;
textFieldParser.FieldWidths = (4,5,8,2,10);

Gruß Ulf

15.07.2014 - 13:34 Uhr

Hey Th69,

danke für die Hilfe - Code funktioniert!

15.07.2014 - 12:36 Uhr

Hallo,

ich möchte strukturierte Textdateien in Excel öffnen. Im Prinzip handelt es sich dabei um CSV-Dateien, bei denen aber der Feldtrenner nicht ; oder , ist sondern Tabulator. Um die Dateien zu öffnen, nutze ich die Funktion

Workbooks.Open(FileName)

Diese Funktion enthält einen möglichen Parameter um die gewünschte Spaltenformatierung mitzugeben. Dieses muss als Array erfolgen. Zur Zeit habe ich dieses Array fest definiert:


int[,] iFormatArray = new int[134, 2] { { 1, 2 }, { 2, 2 }, { 3, 2 }, { 4, 2 }, { 5, 2 }, { 6, 2 }, { 7, 2 }, { 8, 2 }, { 9, 2 }, { 10, 2 }, { 11, 2 }, { 12, 2 }, 
    { 13, 2 }, { 14, 2 }, { 15, 2 }, { 16, 2 }, { 17, 2 }, { 18, 2 }, { 19, 2 }, { 20, 2 }, { 21, 2 }, { 22, 2 }, { 23, 2 }, { 24, 2 }, { 25, 2 }, { 26, 2 }, 
    { 27, 2 }, { 28, 2 }, { 29, 2 }, { 30, 2 }, { 31, 2 }, { 32, 2 }, { 33, 2 }, { 34, 2 }, { 35, 2 }, { 36, 2 }, { 37, 2 }, { 38, 2 }, { 39, 2 }, { 40, 2 }, 
    { 41, 2 }, { 42, 2 }, { 43, 2 }, { 44, 2 }, { 45, 2 }, { 46, 2 }, { 47, 2 }, { 48, 2 }, { 49, 2 }, { 50, 2 }, { 51, 2 }, { 52, 2 }, { 53, 2 }, { 54, 2 }, 
    { 55, 2 }, { 56, 2 }, { 57, 2 }, { 58, 2 }, { 59, 2 }, { 60, 2 }, { 61, 2 }, { 62, 2 }, { 63, 2 }, { 64, 2 }, { 65, 2 }, { 66, 2 }, { 67, 2 }, { 68, 2 }, 
    { 69, 2 }, { 70, 2 }, { 71, 2 }, { 72, 2 }, { 73, 2 }, { 74, 2 }, { 75, 2 }, { 76, 2 }, { 77, 2 }, { 78, 2 }, { 79, 2 }, { 80, 2 }, { 81, 2 }, { 82, 2 },
    { 83, 2 }, { 84, 2 }, { 85, 2 }, { 86, 2 }, { 87, 2 }, { 88, 2 }, { 89, 2 }, { 90, 2 }, { 91, 2 }, { 92, 2 }, { 93, 2 }, { 94, 2 }, { 95, 2 }, { 96, 2 }, 
    { 97, 2 }, { 98, 2 }, { 99, 2 }, { 100, 2 }, { 101, 2 }, { 102, 2 }, { 103, 2 }, { 104, 2 }, { 105, 2 }, { 106, 2 }, { 107, 2 }, { 108, 2 }, { 109, 2 }, 
    { 110, 2 }, { 111, 2 }, { 112, 2 }, { 113, 2 }, { 114, 2 }, { 115, 2 }, { 116, 2 }, { 117, 2 }, { 118, 2 }, { 119, 2 }, { 120, 2 }, { 121, 2 }, { 122, 2 }, 
    { 123, 2 }, { 124, 2 }, { 125, 2 }, { 126, 2 }, { 127, 2 }, { 128, 2 }, { 129, 2 }, { 130, 2 }, { 131, 2 }, { 132, 2 }, { 133, 2 }, { 134, 2 } };

oExcel.Workbooks.OpenText(btnEdit.Tag.ToString(), Type.Missing, Type.Missing, Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierNone,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, iFormatArray);

Soweit funktoniert auch alles wie gewünscht. Allerdings möchte ich das verwendete Array dynamisch aufbauen, je nachdem, wie viele Spalten die Textdatei hat. Wobei ich bei dem Problem bin, dass ich bis jetzt keine Ansatz gefunden habe, der funktioniert hat. Bei diversen Suche im Netz bin ich immer wieder auf den Ansatz von List<> bzw. Dictionary<> gestoßen. Nun habe ich folgenden Ansatz probiert:


Excel.Application oExcel = new Excel.Application();
StreamReader sr = new StreamReader(FileName);
string sLine = sr.ReadLine();
string[] sLineArray = sLine.Split(sDelimeter.ToString().ToCharArray()); // sDelimeter ist als ; gesetzt

Dictionary<int, int> lstFormat = new Dictionary<int,int>();
for (int i = 0; i < sLineArray.Length; i++)
{
	lstFormat.Add(i, 2);
}

oExcel.Visible = true;
oExcel.Workbooks.OpenText(btnEdit.Tag.ToString(), Type.Missing, Type.Missing, Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierNone,
	Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, lstFormat.Keys.ToArray());

Leider bricht das Programm in der Zeile zum Öffnen der Datei mit einer Exception "System.Runtime.InteropServices.COMException" ohne weiter Angaben ab. Ich denke, dass es an der Umwandlung des Dictionary<> in ein Array zu tun hat.

Bin ich mit diesem Ansatz auf dem falschen Weg? Soweit ich gesehen habe, könnte ich bei List<> immer nur einen Wert eintragen, nicht 2, wie bei den Dictionary<>. Im Grunde genommen könnte ich für die Anwendung das oberste Beispiel so lassen, finde es aber recht unprofessionell und unflexibel.

Schon mal vielen Dank für Eure Hilfe!

Gruß Ulf

28.03.2008 - 17:05 Uhr

völlig unspektakulär ...

uksbi => Ulf Kersten Software Bielefeld

Gruß und schönes WE

18.03.2008 - 17:44 Uhr

Versuchs mal damit ...

meineVariable.ToString("###0.000");

Gruß Ulf

17.03.2008 - 09:48 Uhr

Moin,

aus "historischen" Gründen @work immer noch VB6, wird aber bei Neuentwicklung/Umprogrammierung auf C# umgestellt (soweit zeitlich machbar). Web-Projekte fast ausschließlich in PHP.

Gruß Ulf

13.03.2008 - 10:08 Uhr

wo wird die Datenbank erzeugt, bzw. abgelegt? Das sieht mir nach einem Rechteproblem aus.

Moin,

sieht für mich auch so aus ... gerade bei eingestellter Benutzersteuerung hat man bei Vista nicht wirklich eine Chance unter C:\Program Files\XYZ zu schreiben. Habe bei einigen Kunden ähnliche Probleme. Schalte man die Benutzersteuerung aus funzt alles ... allerdings funktionieren dann bisher laufende Programme oftmals nicht mehr 🙁

Das Beste ist wohl in diesem Fall, dass man nicht direkt ins ProgVerzeichnis schreibt sondern ggf. unter %ALLUSERSPROFILE%\ProgramName.

Gruß Ulf

13.03.2008 - 10:00 Uhr

Moin,

also ich könnte Dir Mantis empfehlen. Wir haben das System letzes Jahr auch für ein Uni-Projekt eingesetzt ... ist schnell installiert und auch einfach zu bedienen.

Gruß Ulf

21.11.2007 - 21:19 Uhr

Moin,

mit kostenlos kann ich leider nicht dienen, aber die sfFTPLib.dll von SmartFTP ist schon ne Klasse für sich ... allerdings auch vom Preis.

Gruß Ulf

27.06.2007 - 13:47 Uhr

Beim proggen (wie auch bei allen anderen Tätigkeiten am Rechner) MUSS irgendeine Musik dudeln ... ohne Musik kann ich mich nicht konzentrieren 🙂

Gruß Ulf

14.06.2007 - 16:30 Uhr

das ist normale Ereignisbehandlung. Nichts spezielles.

AH, ok .. Danke

14.06.2007 - 16:26 Uhr

Original von blackcoin
... wie wäre es damit ...

PERFEKT ist fast untertrieben 😉 - mit dem 'sender' hatte ich auch schon versucht, mir fehlte da "nur" das '(TextBox)'.

Noch ne Frage am Rande (damit ich mich weiter schlau machen kann), diese Art und Weise der Behandlung nennt man wie? Da ich mir C# selber beibringen muss/will wäre das ganz hilfreich zu wissen.

Gruß Ulf

14.06.2007 - 13:29 Uhr

Moin,

kleine Frage ... habe für eine Textbox (txtObjWasser) folgenden Code ...

private void txtObjWasser_Leave(object sender, EventArgs e)
{
    // Textbox in '#.##0,00 EUR' formtieren
    decimal dt = Convert.ToDecimal(txtObjWasser.Text);
    txtObjWasser.Text = dt.ToString("#,##0.00 EUR");
}

private void txtObjWasser_Enter(object sender, EventArgs e)
{
    if (txtObjWasser.Text != "")
    {
        // Textbox in '###0,00' formatieren -> EUR wegnehmen
        decimal dt = Convert.ToDecimal(txtObjWasser.Text.Substring(0,txtObjWasser.Text.Length - 4));
        txtObjWasser.Text = dt.ToString("###0.00");
    }
}

Das "Problem" was ich habe ist, dass ich noch 15 Texboxen auf dem Form habe, die ich auch umformatieren muss. Allerdings will ich jetzt nicht für jede Box diese beiden Ereignisse schreiben sondern hätte gern eine einzige Funktion/Klasse, die ich dann nur jeweils aufrufen muss.

Leider stehe ich im Moment ein wenig auf dem Schlauch, wie bzw. wo ich da jetzt ansetzen soll 🤔

Für jeden Ansatz dankbar ... Ulf