<?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[Einlesen einer CSV-Datei mit double-Werten]]></title><description><![CDATA[<p>Hey Community,<br />
ich suche eine sehr effiziente und schnelle Methode, eine große CSV-Datei in ein einfaches double-Array einzulesen. Die Datei besteht dabei aus x (x &gt; 10.000) Reihen mit jeweils 1000 Spalten, und durch ein '\t' getrennt. So sieht meine bisherige Methode aus:</p>
<pre><code>int main() {
    ifstream file;
    double *numbers = new double[10000*1000]; // Hier ist Reihenzahl bekannnt
    int counter = -1;
    file.open(&quot;../file.txt&quot;);
    while(!file.eof()) {
        file &gt;&gt; numbers[++counter];
    }
    file.close();
}
</code></pre>
<p>Selbst mit SSD ist diese Methode sehr langsam, und erfordert eine halbe Minute Wartezeit. Natürlich gäbe es die Möglichkeit, die Datei als Binärdatei zu speichern, und innerhalb eines Bruchteils einer Sekunde einzulesen, ist jedoch in diesem Fall nicht machbar. Wie würdet ihr da vorgehen?</p>
<p>dommynik</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/325228/einlesen-einer-csv-datei-mit-double-werten</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Jul 2026 18:55:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325228.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 21 Apr 2014 10:16:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Einlesen einer CSV-Datei mit double-Werten on Mon, 21 Apr 2014 10:16:24 GMT]]></title><description><![CDATA[<p>Hey Community,<br />
ich suche eine sehr effiziente und schnelle Methode, eine große CSV-Datei in ein einfaches double-Array einzulesen. Die Datei besteht dabei aus x (x &gt; 10.000) Reihen mit jeweils 1000 Spalten, und durch ein '\t' getrennt. So sieht meine bisherige Methode aus:</p>
<pre><code>int main() {
    ifstream file;
    double *numbers = new double[10000*1000]; // Hier ist Reihenzahl bekannnt
    int counter = -1;
    file.open(&quot;../file.txt&quot;);
    while(!file.eof()) {
        file &gt;&gt; numbers[++counter];
    }
    file.close();
}
</code></pre>
<p>Selbst mit SSD ist diese Methode sehr langsam, und erfordert eine halbe Minute Wartezeit. Natürlich gäbe es die Möglichkeit, die Datei als Binärdatei zu speichern, und innerhalb eines Bruchteils einer Sekunde einzulesen, ist jedoch in diesem Fall nicht machbar. Wie würdet ihr da vorgehen?</p>
<p>dommynik</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2395641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2395641</guid><dc:creator><![CDATA[dommynik]]></dc:creator><pubDate>Mon, 21 Apr 2014 10:16:24 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen einer CSV-Datei mit double-Werten on Mon, 21 Apr 2014 10:35:40 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>versuche mal ungepuffert einzulesen:</p>
<pre><code class="language-cpp">ifstream file(&quot;../file.txt&quot;);
file.setbuf(0, 0);

while(file &gt;&gt; numbers[++counter])
{
}
</code></pre>
<p>(und die Leseschleife habe ich auch gleich mal richtig angepasst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2395646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2395646</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Mon, 21 Apr 2014 10:35:40 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen einer CSV-Datei mit double-Werten on Mon, 21 Apr 2014 10:39:43 GMT]]></title><description><![CDATA[<p>Laut <a href="http://www.cplusplus.com/reference/fstream/ifstream/" rel="nofollow">http://www.cplusplus.com/reference/fstream/ifstream/</a> ist diese Methode nicht implementiert? Ich probiere es mal mit <a href="http://www.cplusplus.com/reference/fstream/filebuf/" rel="nofollow">http://www.cplusplus.com/reference/fstream/filebuf/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2395648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2395648</guid><dc:creator><![CDATA[dommynik]]></dc:creator><pubDate>Mon, 21 Apr 2014 10:39:43 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen einer CSV-Datei mit double-Werten on Mon, 21 Apr 2014 10:41:32 GMT]]></title><description><![CDATA[<p>1. Lade den Dateiinhalt in den Speicher<br />
2. Nutze std::stod oder eigene Funktion statt der stream operatoren.<br />
3. Möglicherweise mit Memory mapped files. Das ist dann aber nicht standardkonform und ich habe damit auch kaum Erfahrung.</p>
<p>Th69 schrieb:</p>
<blockquote>
<p>versuche mal ungepuffert einzulesen:</p>
</blockquote>
<p>Die Festplatte ist fast immer das langsamste und buffern reduziert die Anzahl an nötigen Lesezugriffen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2395650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2395650</guid><dc:creator><![CDATA[Marthog]]></dc:creator><pubDate>Mon, 21 Apr 2014 10:41:32 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen einer CSV-Datei mit double-Werten on Mon, 21 Apr 2014 10:43:30 GMT]]></title><description><![CDATA[<p>Eine kurze und elegante Möglichkeit wäre</p>
<pre><code>std::vector&lt;double&gt; vec;
vec.reserve(10000 * 1000);
vec.insert( vec.begin(), std::istream_iterator&lt;double&gt;{file}, std::istream_iterator&lt;double&gt;{} );
</code></pre>
<p>Vielleicht läuft das hier schneller:</p>
<pre><code>#include &lt;vector&gt;
#include &lt;cstdio&gt;
#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

int main()
{
	std::vector&lt;double&gt; vec;
	vec.reserve( 10000 * 1000 );

	auto file = std::fopen(&quot;test.cvs&quot;, &quot;r&quot;);

	for( unsigned x = 0; x != 2; ++x ) // Zeilenanzahl
	{
		for( unsigned y = 0; y != 5; ++y ) // Spaltenzahl
		{
			char str[15];
			char *end_ptr = str;

			for(;;)
			{
				char next = fgetc(file);

				if( next == '\t' || next == '\n' )
					break;

				*end_ptr++ = next;
			}

			*end_ptr = '\0';

			vec.push_back( std::strtod(str, &amp;end_ptr) );
		}
	}

	std::fclose(file);

	for( auto i : vec ) std::cout &lt;&lt; i &lt;&lt; ' ';
}
</code></pre>
<p>Wobei die Datei so aussieht:</p>
<pre><code>1	2	3	4	5
5	4	3	2	1
</code></pre>
<p>Das ganze geht vielleicht noch viel effizienter, wenn die genaue Notation der Fließkommazahlen bekannt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2395651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2395651</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 21 Apr 2014 10:43:30 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen einer CSV-Datei mit double-Werten on Mon, 21 Apr 2014 10:45:27 GMT]]></title><description><![CDATA[<p>Versuch es mal mit der kompletten Datei einlesen:</p>
<pre><code>std::vector&lt;double&gt; numbers;
ifstream file;
char delimiter = &quot;;&quot;;
char* actualPos = readWholeFile(file); // gibt einen Pointer zurück der auf den Anfang der komplett eingelesenen CSV-Datei zeigt
while (*actualPos != '\0')
{
	delWhiteSpaces(); // löscht alle \t und Leerzeichen
	char* oldPos = actualPos;
	while (*actualPos != delimiter)
	{
		actualPos++;
	}
	char temp = *actualPos;
	*actualPos = '\0';
	numbers.push_back(atof(oldPos));
	*actualPos = temp
	actualPos++; // del ;
}
</code></pre>
<p>Die möglichen Fehler musst du halt selbst beachten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2395652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2395652</guid><dc:creator><![CDATA[JulianH]]></dc:creator><pubDate>Mon, 21 Apr 2014 10:45:27 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen einer CSV-Datei mit double-Werten on Mon, 21 Apr 2014 16:54:20 GMT]]></title><description><![CDATA[<p>Ok, hier der richtige Code für ungepufferten Zugriff:</p>
<pre><code class="language-cpp">file.rdbuf()-&gt;pubsetbuf(0, 0);
</code></pre>
<p>Mich würde einfach mal interessieren, wie da so die Zeiten sind. Früher hat das bei den Festplatten immer einen enormen Geschwindigkeitsboost gegeben (da nicht immer doppelt die Daten kopiert werden mussten).</p>
<p>PS. <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/23821">@Marthog</a>, hast du das selber mal wirklich ausprobiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2395709</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2395709</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Mon, 21 Apr 2014 16:54:20 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen einer CSV-Datei mit double-Werten on Tue, 22 Apr 2014 07:40:24 GMT]]></title><description><![CDATA[<p>Marthog schrieb:</p>
<blockquote>
<p>2. Nutze std::stod oder eigene Funktion statt der stream operatoren.</p>
</blockquote>
<p>Warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2395768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2395768</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 22 Apr 2014 07:40:24 GMT</pubDate></item></channel></rss>