<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Arbeiten mit 2 CSV Dateien]]></title><description><![CDATA[<p>So, ich beschäftige mich gerade mit CSV Dateien und hab da 1,2 Probleme...</p>
<p>Grundlegend worauf ich hinaus will: Ich öffne eine CSV Datei, lese mir da Parameter aus, mache mit denen Rechnungen und schreibe sie dann in CSV Datei Nummer 2.</p>
<p>Problem1:<br />
Eigentlich mehr ein &quot;halbes&quot; Problem, da es funktioniert, meine CSV Datei Nummer 1 sieht wie folgt aus:<br />
time, var1, var2, var3<br />
0.1, xx, xx, xx<br />
0.5, xx, xx, xx<br />
1, xx, xx, xx</p>
<p>Ich will zum einen die Variablenleiste oben auslesen (funktioniert und ich denke auch ganz effizient) und ich möchte die &quot;time&quot; Spalte auslesen. Zur Zeit mache ich es so (Code hänge ich gleich), dass ich die Zeile als String auslese, alles wegschneide was nicht hingehört, das ganze in eine Double umwandeln und dann in einem Vektor speicher. Da das aber durchaus mal 1500 Variablen sein können Bau ich gerade quasi eine Bäckerei obwohl ich nur ein Brötchen haben will... Frage ist also ob das nicht irgendwie effizienter geht, da ich schon gemerkt habe, dass das doch ein bisschen Zeit frisst.</p>
<pre><code>while(csv1)
					{	
						std::getline(csv1, readhelp);
						std::size_t found = readhelp.find(&quot;;&quot;);
						if (found!=std::string::npos) readhelp.erase(found,readhelp.length());
						else
						{
							std::size_t found = readhelp.find(&quot;,&quot;); 
							readhelp.erase(found,readhelp.length());
						}
						boost::trim(readhelp);

						try
						{
							doublehelp = boost::lexical_cast&lt;double&gt;(readhelp);
						}
						catch (boost::bad_lexical_cast const&amp;)
						{
							doublehelp = 0;
						}
						timestepvector.push_back (doublehelp);
						anz_timesteps++;
					}
</code></pre>
<p>Nummer 2 laufe ich gerade auf ein Problem auf wo ich nicht genau weiß woran es liegt, deswegen wird das jetzt leider etwas unspezifisch, vielleicht kann mir ja trotzdem jemand helfen...</p>
<p>ich will ja erst CSV Datei 1 öffnen um dann entsprechend die Infos auszulesen. Dann will ich die CSV Datei 2 erstellen um da alles reinzuschreiben. Das ganze funktioniert jeweils für sich auch gut, aber wenn ich das zusammenpacke schreibt er mir die CSV Datei 2 nicht mehr, erst wieder, wenn ich das einlesen der ersten Datei auskommentiere. Mal so die Elementaren Schritte die ich mit den Dateien mache, vielleicht kann mir ja jemand sagen was fehlt (oder wo noch mehr Input benötigt ist).</p>
<pre><code>std::ifstream csv1;
csv1.imbue(std::locale(&quot;&quot;));
csv1.open(ref_csvfile, std::ios::in);
csv1.close();

std::ofstream myfile;
myfile.imbue(std::locale(&quot;&quot;));
myfile.open(outputfile);
myfile.close();
</code></pre>
<p>Das myfile.open funktioniert wie gesagt wunderbar, solange ich das ganze csv1 gekröse weglasse...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/318420/arbeiten-mit-2-csv-dateien</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Jul 2026 16:08:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/318420.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 12 Jul 2013 08:12:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Arbeiten mit 2 CSV Dateien on Fri, 12 Jul 2013 08:12:52 GMT]]></title><description><![CDATA[<p>So, ich beschäftige mich gerade mit CSV Dateien und hab da 1,2 Probleme...</p>
<p>Grundlegend worauf ich hinaus will: Ich öffne eine CSV Datei, lese mir da Parameter aus, mache mit denen Rechnungen und schreibe sie dann in CSV Datei Nummer 2.</p>
<p>Problem1:<br />
Eigentlich mehr ein &quot;halbes&quot; Problem, da es funktioniert, meine CSV Datei Nummer 1 sieht wie folgt aus:<br />
time, var1, var2, var3<br />
0.1, xx, xx, xx<br />
0.5, xx, xx, xx<br />
1, xx, xx, xx</p>
<p>Ich will zum einen die Variablenleiste oben auslesen (funktioniert und ich denke auch ganz effizient) und ich möchte die &quot;time&quot; Spalte auslesen. Zur Zeit mache ich es so (Code hänge ich gleich), dass ich die Zeile als String auslese, alles wegschneide was nicht hingehört, das ganze in eine Double umwandeln und dann in einem Vektor speicher. Da das aber durchaus mal 1500 Variablen sein können Bau ich gerade quasi eine Bäckerei obwohl ich nur ein Brötchen haben will... Frage ist also ob das nicht irgendwie effizienter geht, da ich schon gemerkt habe, dass das doch ein bisschen Zeit frisst.</p>
<pre><code>while(csv1)
					{	
						std::getline(csv1, readhelp);
						std::size_t found = readhelp.find(&quot;;&quot;);
						if (found!=std::string::npos) readhelp.erase(found,readhelp.length());
						else
						{
							std::size_t found = readhelp.find(&quot;,&quot;); 
							readhelp.erase(found,readhelp.length());
						}
						boost::trim(readhelp);

						try
						{
							doublehelp = boost::lexical_cast&lt;double&gt;(readhelp);
						}
						catch (boost::bad_lexical_cast const&amp;)
						{
							doublehelp = 0;
						}
						timestepvector.push_back (doublehelp);
						anz_timesteps++;
					}
</code></pre>
<p>Nummer 2 laufe ich gerade auf ein Problem auf wo ich nicht genau weiß woran es liegt, deswegen wird das jetzt leider etwas unspezifisch, vielleicht kann mir ja trotzdem jemand helfen...</p>
<p>ich will ja erst CSV Datei 1 öffnen um dann entsprechend die Infos auszulesen. Dann will ich die CSV Datei 2 erstellen um da alles reinzuschreiben. Das ganze funktioniert jeweils für sich auch gut, aber wenn ich das zusammenpacke schreibt er mir die CSV Datei 2 nicht mehr, erst wieder, wenn ich das einlesen der ersten Datei auskommentiere. Mal so die Elementaren Schritte die ich mit den Dateien mache, vielleicht kann mir ja jemand sagen was fehlt (oder wo noch mehr Input benötigt ist).</p>
<pre><code>std::ifstream csv1;
csv1.imbue(std::locale(&quot;&quot;));
csv1.open(ref_csvfile, std::ios::in);
csv1.close();

std::ofstream myfile;
myfile.imbue(std::locale(&quot;&quot;));
myfile.open(outputfile);
myfile.close();
</code></pre>
<p>Das myfile.open funktioniert wie gesagt wunderbar, solange ich das ganze csv1 gekröse weglasse...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2338348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2338348</guid><dc:creator><![CDATA[Ynnead]]></dc:creator><pubDate>Fri, 12 Jul 2013 08:12:52 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit 2 CSV Dateien on Fri, 12 Jul 2013 09:45:33 GMT]]></title><description><![CDATA[<p>Habe Dein Problem nur kurz überflogen und Dir mal schnell folgenden Ansatz zusammengeschrieben. Sollte so in etwa auch compilieren, habs aber nicht getestet. Vielleicht hilfts Dir.</p>
<p>Gruss</p>
<pre><code>std::ifstream ifs(&quot;input.csv&quot;);
if (ifs.fail()) {
  // error
}

// Iterate tokens
std::string in;
std::vector&lt;std::string&gt; input;
while (!getline(ifs, in).eof()) {
  boost::algorithm::trim(in);
  if (in.empty()) {
    continue;
  }

  input.push_back(in);
}

std::ofstream ofs(&quot;output.csv&quot;);
if (ofs.fail()) {
  // error
}

std::vector&lt;std::string&gt; output;
// do something with output...

for (auto &amp;out : output) {
  ofs &lt;&lt; out &lt;&lt; &quot;;&quot; &lt;&lt; &quot;\n&quot;;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2338367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2338367</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Fri, 12 Jul 2013 09:45:33 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit 2 CSV Dateien on Fri, 12 Jul 2013 10:31:09 GMT]]></title><description><![CDATA[<p>Ynnead schrieb:</p>
<blockquote>
<p>... Frage ist also ob das nicht irgendwie effizienter geht, da ich schon gemerkt habe, dass das doch ein bisschen Zeit frisst.</p>
<pre><code>while(csv1)
					{	
						std::getline(csv1, readhelp);
						std::size_t found = readhelp.find(&quot;;&quot;);
						if (found!=std::string::npos) readhelp.erase(found,readhelp.length());
						else
						{
							std::size_t found = readhelp.find(&quot;,&quot;); 
							readhelp.erase(found,readhelp.length());
						}
						boost::trim(readhelp);

						try
						{
							doublehelp = boost::lexical_cast&lt;double&gt;(readhelp);
						}
						catch (boost::bad_lexical_cast const&amp;)
						{
							doublehelp = 0;
						}
						timestepvector.push_back (doublehelp);
						anz_timesteps++;
					}
</code></pre>
</blockquote>
<p>es geht vor allem sehr viel einfacher und ohne boost-Hilfe</p>
<pre><code>for( double doublehelp; csv1 &gt;&gt; doublehelp; csv1 &gt;&gt; skipline, ++anz_timesteps )
        timestepvector.push_back (doublehelp);
</code></pre>
<p><a href="http://www.c-plusplus.net/forum/p2194380#2194380" rel="nofollow">skiplin</a>e sieht so aus:</p>
<pre><code>std::istream&amp; skipline( std::istream&amp; in )
{
    return in.ignore( std::numeric_limits&lt; std::streamsize &gt;::max(), '\n' ); // erfordert #include &lt;limits&gt;
}
</code></pre>
<p>sei noch der Unterschied bemerkt, dass die for-Schleife bei einem Lesefehler des 'double' beendet wird - Deine Lösung dagegen nicht. Ersteres finde ich dem Problem aber eher angemessen.</p>
<p>Tomahawk schrieb:</p>
<blockquote>
<p>.. mal schnell folgenden Ansatz zusammengeschrieben.</p>
<pre><code>// ...
while (!getline(ifs, in).eof()) {
  // bearbeite 'in'
</code></pre>
</blockquote>
<p>Ja - man findet derartige Codeschnipsel tausendfach im Internet. <a href="http://www.c-plusplus.net/forum/p2042572#2042572" rel="nofollow">Trotzdem ist es falsch bzw. fehlerhaft</a>.<br />
Bei einem fatalen Lesefehler (badbit) würde das in einer Endlosschleife enden, da ifs nie nach EOF geht und die letzte Zeile würde nie gelesen werden, wenn sie nicht mit einem Linefeed beendet ist.</p>
<p>Zu dem 2.Problem fällt mir so nichts ein. Ich würde Dir empfehlen, nach dem Öffnen einer Datei in jedem Fall mit <a href="http://www.cplusplus.com/reference/fstream/ifstream/is_open/" rel="nofollow">is_open</a> abzufragen, ob alles Ok ist.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2338377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2338377</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 12 Jul 2013 10:31:09 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit 2 CSV Dateien on Fri, 12 Jul 2013 10:51:14 GMT]]></title><description><![CDATA[<p>O.k., das ist wirklich deutlich einfacher... Danke schonmal dafür <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Mit den Datein ist halt ein großes Problem vor allem weil ich überhaupt nicht weiß woran es liegt... Das Problem ist, alles was ich bisher an Dokumentation zum Arbeiten mit Dateien gefunden habe ist immer genau eine Datei, mir würde da ja auch schonmal helfen wenn irgendwo mal mehrere beschrieben sind ob man da auf irgendwas spezielles noch achten muss...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2338379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2338379</guid><dc:creator><![CDATA[Ynnead]]></dc:creator><pubDate>Fri, 12 Jul 2013 10:51:14 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit 2 CSV Dateien on Fri, 12 Jul 2013 11:07:14 GMT]]></title><description><![CDATA[<p>Ynnead schrieb:</p>
<blockquote>
<p>Mit den Datein ist halt ein großes Problem vor allem weil ich überhaupt nicht weiß woran es liegt... Das Problem ist, alles was ich bisher an Dokumentation zum Arbeiten mit Dateien gefunden habe ist immer genau eine Datei, mir würde da ja auch schonmal helfen wenn irgendwo mal mehrere beschrieben sind ob man da auf irgendwas spezielles noch achten muss...</p>
</blockquote>
<p>Grundsätzlich macht man bei mehr als einer Datei alles nur mehrfach. D.h. wenn Du weißt, wie man mit einer Datei umgeht, so kannst Du das einfach vervielfachen. Das sollte dann keine Seiteneffekte haben, solange Du eine Datei immer nur genau mit einem <code>i/ofstream</code> -Objekt bearbeitest!</p>
<p>Bisher hast Du auch nicht gesagt, was genau 'nicht funktioniert'. Ist die Datei vorhanden? Ist sie leer? War sie vorher schon da? Ist sie schreibgeschützt? Was steht drin und was erwartest Du was da drin stehen sollte?<br />
Füge in jedem Fall die Abfrage mit <code>is_open</code> ein.</p>
<p>Bleibt mir noch die Frage, ob es möglich wäre, die Dateien auch gleichzeitig zu bearbeiten? Kannst Du den Wert, den Du aus der einen Datei liest, nicht sofort in die Zieldatei schreiben ohne ihn in einem <code>vector</code> zwischen zu speichern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2338383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2338383</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 12 Jul 2013 11:07:14 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit 2 CSV Dateien on Fri, 12 Jul 2013 11:40:02 GMT]]></title><description><![CDATA[<p>Gleichzeitig lesen und schreiben geht nicht, ich lese Inputwerte für eine größere Rechnung aus (die dauert auch etwas) und schreibe dann die Ergebnisse der Rechnung in die zweite csv.</p>
<p>Die zweite csv Datei ist vorher nicht da und soll mir vom Programm erstellt werden.</p>
<p>Wird sie aber nicht, ABER wenn ich die Zeile</p>
<pre><code>my_csv_file.open(ref_csvfile, std::ios::in);
</code></pre>
<p>auskommentiere wird mir danach auch von myfile.open(outputfile); anstandslos die Datei erstellt. Und bevor die Vermutung aufkommt, die Variable &quot;outputfile&quot; wird vor dem einlesen der csv schon komplett fertig generiert und auch im Programm dann nicht weiter angefasst bis zu dem myfile.open...</p>
<p>Ich bekomme auch in beiden Fällen keine Fehlermeldungen beim Kompilieren (VS 2010) oder im Terminal, die Datei ist dann halt einfach nicht da. Deswegen kann ich dazu halt auch grad so wenig sagen, weil es so aussieht, als wenn alles reibungslos klappen würde, mit der Ausname, dass die Datei nicht erzeugt wird...</p>
<p>Die erste Datei wird übrigens auch korrekt geöffnet (auslesen klappt auch anstandslos).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2338390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2338390</guid><dc:creator><![CDATA[Ynnead]]></dc:creator><pubDate>Fri, 12 Jul 2013 11:40:02 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit 2 CSV Dateien on Fri, 12 Jul 2013 12:13:54 GMT]]></title><description><![CDATA[<p>Dann entweder selber debuggen oder uns ein vollständiges Minimalbeispiel zeigen, mit dem man den Fehler reproduzieren kann. Siehe dritter Link in meiner Signatur.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2338407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2338407</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 12 Jul 2013 12:13:54 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit 2 CSV Dateien on Fri, 12 Jul 2013 13:33:24 GMT]]></title><description><![CDATA[<p>Jetzt beim erstellen des Minimalbeispiels hab ich festgestellt, dass es doch so funktioniert wie ich mir das vorstelle, nur bei mir dann irgendwo nen Bug drin ist... ich versuch dann erstmal selber den Fehler zu finden, ansonsten meld ich mich nochmal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2338432</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2338432</guid><dc:creator><![CDATA[Ynnead]]></dc:creator><pubDate>Fri, 12 Jul 2013 13:33:24 GMT</pubDate></item></channel></rss>