c++, csv파일 정렬 후 저장 문제

minyoung347의 이미지

안녕하세요,
C++로 대용량 csv 파일을 다루고 있는데 작업 도중에 문제가 생겼습니다.
설명 드리기 위해서 문제를 단순하게 만들었습니다.

먼저 test.csv 파일을 읽어서 숫자를 기준으로 정렬하고 그 결과를 out.csv파일에 저장했습니다.
그 후에 out.csv 파일을 불러와서 getline,while문으로 한줄한줄 화면에 출력했습니다.

out.csv파일을 읽어와서 화면에 출력할 수 있다고 생각했는데
out.csv파일에는 정렬된 결과가 저장되었지만
화면에는 아무 정보도 출력되지 않습니다.

만약, test.csv 파일이 (9x2)이 아니라 (Nx2) 정도가 되면, 전체가 아닌 일부분만 화면에 출력 됩니다.
(제 pc를 기준으로 N=2500 이고, N=1000 일 때는 아무것도 출력 되지 않습니다.)

이런 문제가 생기는 이유에 대해서 알려주시면 감사하겠습니다.

--------------------------------------------------------------------------------------------
test.csv (9x2)입니다
5,a
7,b
2,c
9,d
1,e
3,f
6,g
4,h
8,i

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;
 
// class for sort
class sort_class
{
private:
string string1, string2;
 
public:
sort_class(const string& init_string1, const string& init_string2);
 
friend int Compare_By_string1(const sort_class& lhs, const sort_class& rhs);
friend ostream& operator<<(ostream& os, const sort_class& obj)
{
	os<<obj.string1<<','<<obj.string2;
	return os;
}
};
 
sort_class::sort_class(const string& init_string1, const string& init_string2)
:string1(init_string1), string2(init_string2){}
 
// function that sorts by string1
int Compare_By_string1(const sort_class& lhs, const sort_class& rhs)
{
	return (lhs.string1<rhs.string1);
}
 
 
int main()
{
// read test.csv file and put them into the test_vector
ifstream file("test.csv");
vector<sort_class> test_vector;
 
string string1, string2;
while(getline(file, string1,',')
&&getline(file,string2,'\n'))
{
	test_vector.push_back(sort_class(string1,string2));
}
file.close();
 
// sort the test_vector by string1
sort(test_vector.begin(), test_vector.end(),Compare_By_string1);
 
// write the sorted test_vector on out.csv file
ofstream fout("out.csv");
std::ostream_iterator<sort_class> output_iterator(fout,"\n");
std::copy(test_vector.begin(),test_vector.end(),output_iterator);
 
// read out.csv and then print out.csv on the screen
string line;
ifstream out ("out.csv");
if(out.is_open())
{
	while(getline(out,line))
		cout<<line<<endl;
}
out.close();
return 0;
}

kukyakya의 이미지

fout에 copy한 후에 close()로 닫으시면 될 듯 합니다.

...
std::copy(test_vector.begin(),test_vector.end(),output_iterator);
fout.close();
 
// read out.csv and then print out.csv on the screen
string line;
...

파일에 쓰고 그 파일을 다시 읽어서 출력하는것보다는 파일에 쓰고 나서 표준출력으로도 쓰시면 더 간단하지 않을까요?

...
std::copy(test_vector.begin(),test_vector.end(),output_iterator);
std::copy(test_vector.begin(), test_vector.end(), std::ostream_iterator<sort_class>(std::cout, "\n"));

PS. Compare_By_string1의 반환값은 bool로 쓰시는게 더 나을 것 같습니다.

minyoung347의 이미지

fout.close();를 추가해서 문제를 바로 해결했습니다.
표준출력과 bool 반환값도 말씀하신대로 수정했습니다.
친절하게 답변해 주셔서 정말 감사합니다.

eco3165의 이미지

코드에 대한 질문 좀 드려도 될까요?

제가 c++로 csv 파일을 읽는 코드를 짜고 있는데

위의 코드로 하니 정렬이 잘못되서 나옵니다. string1의 값을 비교하는게 맞다면,

1~100까지 있을 때 숫자의 첫자리 값만을 비교해서 결과가 나오게 됩니다.(1,10,11,12,...2,21,22,...3,31,32 <- 이런 식으로요)

Compare의 코드를 바꿔야 하는건가요..?

그리고 out.csv 파일을 읽어올 때 제가 원하는 부분만 출력하게 하는건 어떻게 해야하나요?

(10열짜리 데이터라면 2,3번째 열만 출력을 하는..)

혹시 도움 주실 수 있는분 있으시면 꼭 도와주시면 감사하겠습니다ㅠㅠ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.