안녕하세요 C언어 파일에서 특정 내용 추출후 저장하기

zeros48의 이미지

안녕하세요 프로그램을 하나 작성하고 있는데 현제 데이터가 다음과 같이 저장되어 있습니다.

1, 000000, 20190208, zeros
2, 000010, 20190208, pina
3, 000020, 20190208, ade
4, 000000, 20190208, wep
5, 000000, 20190208, wewq
6, 000000, 20190208, qweq1
7, 000020, 20190208, aded
8, 000010, 20190208, pina

순서, 일련번호, 날짜, id 이런식으로 csv파일에 저장되어 있는데

데이터를 읽어오는 방법은 알겠는데 같은 일련번호의 데이터끼리 묶어서 출력하려면 어떤 방법이 좋을까요?

000000 : 4건
000010 : 2건
000020 : 2건

이런식으로 하려고 합니다

조언 해주시면 감사하겠습니다~

익명 사용자의 이미지

아래 처럼 linked list로 구현하면 좋지 않을까요?

typedef struct node
{
  unsigned int key;
  unsigned int count;
  time_t time;
  char *data;
 
  struct node *next;
}mynode;
 
key = 일련번호

일련번호화 key 비교 후에 값이 일치하면 해당 node의 count 값을 ++ 해주면 될 것 같습니다.

딱히 좋은 방법이 안떠오르네요

zeros48의 이미지

고려했던 방안하고 일치하네요..ㅎㅎ

raymundo의 이미지

파일 입출력 / 문자열 분리 / 해시테이블(딕셔너리, 뭐라 부르든 암튼 키-값 쌍들을 저장할 수 있는 구조) 세 가지를 쉽게 쓸 수 있는 스크립트 언어를 쓰시는 게 최선이지 싶고요.

기본 동작은 윗분 댓글처럼 일련번호를 키로 해서, 거기에 대응되는 값을 1증가시키면서 입력을 다 읽고 나면 최종적으로 각 키마다 몇 번 등장했는지 저장되어 있겠죠.

사정상 C로 해야 한다면 파일 한줄씩 읽거나 문자열에서 일련번호 부분을 잘라내는 건 그나마 나을 테고 키-값 저장하는 게 좀 귀찮겠네요.

리눅스에서는 범용 해시 테이블을 라이브러리에서 제공합니다.
http://forum.falinux.com/zbxe/?mid=C_LIB&page=7&document_srl=408334

아니면 직접 만들거나 인터넷에서 적당한 구현체를 가져다 쓰셔야 할 텐데, 링크드 리스트나 배열을 쓰는 건 입력이 많으면(특히 일련번호의 가짓수가 많으면) 별로 좋은 생각 같지 않습니다. 입력 한 줄 읽을 때마다 다시 리스트나 배열 전체를 순회해야 하니까요. 트리 구조를 쓰거나... 가능하면 일련번호로부터 한번에 해당 키의 위치를 얻어낼 수 있는 해시함수를 생각하시거나.

단지 숫자만 한 번 세어 출력하면 되고 입력데이터의 양이 충분히 작다면, 문자열의 배열을 써서
입력라인 전체를 일련번호가 제일 앞에 오도록 각 라인별로 배열의 원소로 저장하고,
그 배열을 한 번 정렬하면 동일한 일련번호들끼리 뭉치겠죠.
그러면 그 배열을 처음부터 읽으면서 일련번호가 직전 라인과 동일하면 카운트를 1 증가하고,
직전 라인과 달라지면 그 시점의 카운트값을 출력하고 다시 1부터 시작하는 식으로 진행할 수도 있겠네요.

좋은 하루 되세요!

zeros48의 이미지

자바로 짜면 참 편할듯 한데 상황이 C로 짜야 되서요
정보 감사드려요

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.