doubles wegschrijven in CSV

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • NLBUURMAN
  • Registratie: November 2012
  • Laatst online: 17-09 10:21

NLBUURMAN

Het Koffiemonster

Topicstarter
Op het moment gebruik ik Visual Studio om wat in C# te programmeren, maar het wegschrijven naar een .csv lukt me nog niet helemaal.
Ik heb verschillende doubles die ik wil wegschrijven elke iteratie, en ze tevoorschijn toveren via console.writeline lukt prima met een "| " er tussen.

Nou wil ik eigenlijk een CSV bestand gebruiken en de data hier naar toe wegschrijven, maar ik krijg het niet voor elkaar, na wat youtube tutorials en wat googelen ben ik er nog niet uit gekomen helaas.
Een "normaal" Excelbestand mag ook, het is de bedoeling dat deze data namelijk vervolgens makkelijk te gebruiken is in matlab en excel.

Heeft iemand een idee hoe ik dit het simpelst kan doen?

[ Voor 4% gewijzigd door NLBUURMAN op 13-03-2019 10:09 ]

R7-3700X/MSI B550 Tomahawk/32GB RAM/NZXT H440/Phanteks TC14PE/Asrock RX6600XT Challenger

Beste antwoord (via NLBUURMAN op 13-03-2019 11:27)


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
NLBUURMAN schreef op woensdag 13 maart 2019 @ 10:36:
Als ik

C#: test
1
2
3
4
5
using (System.IO.StreamWriter file = 
            new System.IO.StreamWriter(@"Pad naar file", true))
        {
            file.WriteLine(+VarA,"," +VarB);
        }


implementeer geeft mijn visual studio aan:
"The name 'file' does not exist in the current context"
Nee hoor. Je post of "aangepaste" code, of je krijgt die foutmelding niet ;) Post eens je échte code.

Dit werkt gewoon:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System.IO;

public class Program
{
    private static void Main(string[] args)
    {
        var VarA = 1.234d;
        var VarB = 5.678d;

        using (var file = new StreamWriter(@"d:\test.txt", true))
        {
            file.WriteLine(VarA + "," + VarB);
        }
    }
}

En dat is, in essentie, gewoon jouw code (alleen gebruik ik een using i.p.v. telkens de volledige namespace opgeven en gebruik ik var i.p.v. het specifieke type. Als VarA en VarB échte variable namen zijn dan moet je daar ook nog eens goed over nadenken ;)

Maar bovenstaand toont wel meteen mooi 't probleem: in de file krijg je (met een nl_NL locale):
1,234,5,678


De lompste manier is om je hele applicatie gewoon te switchen van locale (ergens als 1 van de eerste regels code in je applicatie):
C#:
1
2
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;

Zie CurrentCulture en CurrentUICulture.

Netter/beter is zoiets:
C#:
1
2
3
4
5
6
7
8
var culture = CultureInfo.InvariantCulture;
var VarA = 1.234d;
var VarB = 5.678d;

using (var file = new StreamWriter(@"d:\test.txt", true))
{
    file.WriteLine(VarA.ToString(culture) + "," + VarB.ToString(culture));
}

[ Voor 63% gewijzigd door RobIII op 13-03-2019 10:52 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Alle reacties


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Wat werkt niet? Schrijven naar een textfile is niet moeilijk: https://docs.microsoft.co...w-to-write-to-a-text-file

Zo lang je alleen doubles schrijft en geen text kom je er wel mee weg het met de hand te doen. Maar het is wel slimmer om een CSV library te gebruiken die de formatting/escaping voor je regelt.

https://niels.nu


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 22:45

Cyphax

Moderator LNX
Wat @Hydra zegt: gebruik een library hiervoor, vind het wiel niet opnieuw uit. Ik heb zelf altijd FileHelpers gebruikt. Zit in de NuGet repositories.

Saved by the buoyancy of citrus


Acties:
  • +2 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Mijn spidey-sense zegt dat 't probleem is dat je computer in een NL Locale ingesteld staat wat betekent dat een double wordt weggeschreven als 1,234 i.p.v. 1.234 waarbij die eerste natuurlijk een probleem is in een CSV. Je zult dus waar je de string genereert voor in de file een culture moeten opgeven. Maar omdat je geen relevante(!) code post is 't dus gissen en kunnen we ook niet aangeven welk stuk code je beter moet bekijken / aanpassen. Dus: laat eens wat relevante(!) code zien? (Gebruik code tags a.u.b).

Relevante links: deze twee overloads van ToString().

Voor een volgende keer "het wegschrijven naar een .csv lukt me nog niet helemaal" en "ik krijg het niet voor elkaar" is natuurlijk geen probleembeschrijving. Wat lukt er dan niet? Krijg je foutmelding? Wat gebeurt er wel/niet wat je niet/wel wil? Waar gaat 't mis? Net zo min kunnen we met "wat youtube tutorials en wat googelen"; geef dan aan wélke je gekeken hebt, waarop je gegoogled hebt, wat je vond, wat je daar niet aan begreep, ... enfin: gewoon Quickstart dus.

[ Voor 45% gewijzigd door RobIII op 13-03-2019 10:28 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • NLBUURMAN
  • Registratie: November 2012
  • Laatst online: 17-09 10:21

NLBUURMAN

Het Koffiemonster

Topicstarter
Als ik

C#: test
1
2
3
4
5
using (System.IO.StreamWriter file = 
            new System.IO.StreamWriter(@"Pad naar file", true))
        {
            file.WriteLine(+VarA,"," +VarB);
        }


implementeer geeft mijn visual studio aan:
"The name 'file' does not exist in the current context"

VarA en VarB zijn nog leeg, dus op dit moment loop ik nog niet tegen het probleem aan zoals @RobIII omschrijft dat het punt/comma-probleem aangehaald wordt. Ik verwacht hier nog wel tegenaan te lopen.

Daarna wil ik na VarB nog meer doubles toevoegen en als laatste ook nog een string

R7-3700X/MSI B550 Tomahawk/32GB RAM/NZXT H440/Phanteks TC14PE/Asrock RX6600XT Challenger


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
NLBUURMAN schreef op woensdag 13 maart 2019 @ 10:36:
Als ik

C#: test
1
2
3
4
5
using (System.IO.StreamWriter file = 
            new System.IO.StreamWriter(@"Pad naar file", true))
        {
            file.WriteLine(+VarA,"," +VarB);
        }


implementeer geeft mijn visual studio aan:
"The name 'file' does not exist in the current context"
Nee hoor. Je post of "aangepaste" code, of je krijgt die foutmelding niet ;) Post eens je échte code.

Dit werkt gewoon:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System.IO;

public class Program
{
    private static void Main(string[] args)
    {
        var VarA = 1.234d;
        var VarB = 5.678d;

        using (var file = new StreamWriter(@"d:\test.txt", true))
        {
            file.WriteLine(VarA + "," + VarB);
        }
    }
}

En dat is, in essentie, gewoon jouw code (alleen gebruik ik een using i.p.v. telkens de volledige namespace opgeven en gebruik ik var i.p.v. het specifieke type. Als VarA en VarB échte variable namen zijn dan moet je daar ook nog eens goed over nadenken ;)

Maar bovenstaand toont wel meteen mooi 't probleem: in de file krijg je (met een nl_NL locale):
1,234,5,678


De lompste manier is om je hele applicatie gewoon te switchen van locale (ergens als 1 van de eerste regels code in je applicatie):
C#:
1
2
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;

Zie CurrentCulture en CurrentUICulture.

Netter/beter is zoiets:
C#:
1
2
3
4
5
6
7
8
var culture = CultureInfo.InvariantCulture;
var VarA = 1.234d;
var VarB = 5.678d;

using (var file = new StreamWriter(@"d:\test.txt", true))
{
    file.WriteLine(VarA.ToString(culture) + "," + VarB.ToString(culture));
}

[ Voor 63% gewijzigd door RobIII op 13-03-2019 10:52 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • NLBUURMAN
  • Registratie: November 2012
  • Laatst online: 17-09 10:21

NLBUURMAN

Het Koffiemonster

Topicstarter
RobIII schreef op woensdag 13 maart 2019 @ 10:43:
[...]

Nee hoor. Je post of "aangepaste" code, of je krijgt die foutmelding niet ;) Post eens je échte code.
buiten de variabelen die anders genoemd zijn en het pad naar de file die ik even weggehaald heb staat dit wel degelijk in mijn code, in een public void waarin alle doubles meegenomen worden.

Afbeeldingslocatie: https://i.ibb.co/k2WY8wh/error.png

[ Voor 12% gewijzigd door RobIII op 13-03-2019 10:53 . Reden: Afbeelding gefixed ]

R7-3700X/MSI B550 Tomahawk/32GB RAM/NZXT H440/Phanteks TC14PE/Asrock RX6600XT Challenger


Acties:
  • +1 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Lees How do I ask a good question? en maak een Minimal, Complete, and Verifiable example. Een screenshot van je compiler-errors bewijst niets, zeker niet als je de code niet toont.

Gezien je nóg een fout hebt op diezelfde regel, namelijk dat een komma wordt verwacht, heb je waarschijnlijk een haakje te veel of te weinig ergens staan.

Sterker nog, in combinatie met de warning "possible mistaken empty statement" op regel 378, heb je waarschijnlijk ook nog je using afgesloten met een puntkomma; file is dan out-of-scope op regel 380.

[ Voor 21% gewijzigd door CodeCaster op 13-03-2019 10:56 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
NLBUURMAN schreef op woensdag 13 maart 2019 @ 10:52:
buiten de variabelen die anders genoemd zijn en het pad naar de file die ik even weggehaald heb staat dit wel degelijk in mijn code
Waarom werkt die code bij mij dan wel? Sowieso heb je in de code die je laat zien al een syntax-error; die code compiled dus niet eens (zie ook je screenshot). Ergens zit een verschil ;) Verder voegt je screenshot niks toe. We willen de code zien (en dan mag je 't pad best even er uit halen of vervangen door "XXX" ofzo). En dan niet in een screenshot a.u.b, maar code die we kunnen copy/pasten m.b.v. code tags.

Overigens: de laatste warning geeft 't wel weg ;) (Evenals CodeCaster in "doubles wegschrijven in CSV" overigens :P )

[ Voor 47% gewijzigd door RobIII op 13-03-2019 11:02 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • NLBUURMAN
  • Registratie: November 2012
  • Laatst online: 17-09 10:21

NLBUURMAN

Het Koffiemonster

Topicstarter
RobIII schreef op woensdag 13 maart 2019 @ 10:54:
[...]

Waarom werkt die code bij mij dan wel? Sowieso heb je in de code die je laat zien al een syntax-error. Ergens zit een verschil ;) Verder voegt je screenshot niks toe. We willen de code zien (en dan mag je 't pad best even er uit halen). En dan niet in een screenshot a.u.b, maar code die we kunnen copy/pasten m.b.v. code tags.
Ik heb inderdaad alles nog eve nagelopen, en ik had automatisch een ; toegevoegd achter de using-clausule, waardoor hij file inderdaad niet kent. Bedankt @CodeCaster voor deze tip!

VarA en VarB zijn niet de echte namen, maar dat maakt voor het principe niet uit. Bedankt voor de nette manier om die omgeving netjes aan te passen; lijkt mij handig voor mijn gevolg aangezien het om Row/Columns gaat, die op zeer veel cijfers achter de komma binnen komen.

C#: code
1
2
3
4
5
6
 using (System.IO.StreamWriter file = 
                            new System.IO.StreamWriter(@"PATH", true))
                    {
                        file.WriteLine(Convert.ToString(Column), Convert.ToString(Row));
                    
                    }


Zou in principe moeten werken, waarbij die Column/Row eventueel nog geconverteerd moeten worden zoals voorgesteld

R7-3700X/MSI B550 Tomahawk/32GB RAM/NZXT H440/Phanteks TC14PE/Asrock RX6600XT Challenger


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
NLBUURMAN schreef op woensdag 13 maart 2019 @ 11:03:
die op zeer veel cijfers achter de komma binnen komen.
Definieer zeer veel...

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • NLBUURMAN
  • Registratie: November 2012
  • Laatst online: 17-09 10:21

NLBUURMAN

Het Koffiemonster

Topicstarter
stuk of 8-10

R7-3700X/MSI B550 Tomahawk/32GB RAM/NZXT H440/Phanteks TC14PE/Asrock RX6600XT Challenger


Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Lees je even in in Floats (ook wel drijvende komma of zwevende komma getallen). Hou er rekening mee dat een double niet alle komma-getallen exact kan representeren. Afhankelijk van de vereiste precisie en/of toegestane "afronding" zou 't kunnen zijn dat je een decimal of ander type moet overwegen.

[ Voor 32% gewijzigd door RobIII op 13-03-2019 11:40 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1