CSVファイルを読み込んで構造体に登録したいです。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sou

CSVファイルを読み込んで構造体に登録したいです。

#1

投稿記事 by sou » 6年前

お世話になっております。
CSVファイルを読み込んで構造体に登録したいです。 ,, が続く値がない場所には0を入れたいのですがなかなかうまくいきません。どなたか間違いがありましたらをご指摘お願いいたします。

コード:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


#include "csv_lib.h"
#include "csv_struct.h"


int main(void){

	char str_2[CSV_RECODE_SIZE_MAX];
	FILE *fp2; 
	CARSPRICE carsprice[1024];
	int DataCount_2 = 0;


	fp2 = fopen("cars_price_list.csv","r");
	while(fgets(str_2, CSV_RECODE_SIZE_MAX, fp2)){
	sscanf(str_2, "%[^,],%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
	carsprice[DataCount_2].car_code,
	&carsprice[DataCount_2].car_base,
	&carsprice[DataCount_2].option_price[0],
	&carsprice[DataCount_2].option_price[1],
	&carsprice[DataCount_2].option_price[2],
	&carsprice[DataCount_2].option_price[3],
	&carsprice[DataCount_2].option_price[4],
	&carsprice[DataCount_2].option_price[5],
	&carsprice[DataCount_2].option_price[6],
	&carsprice[DataCount_2].option_price[7],
	&carsprice[DataCount_2].option_price[8],
	&carsprice[DataCount_2].option_price[9],
	&carsprice[DataCount_2].option_price[10],
	&carsprice[DataCount_2].option_price[11],
	&carsprice[DataCount_2].option_price[12],
	&carsprice[DataCount_2].option_price[13],
	&carsprice[DataCount_2].option_price[14],
	&carsprice[DataCount_2].option_price[15]);
	DataCount_2++;
	printf(str_2);
	}

		if(carsprice[DataCount_2].option_price[0]==NULL)
		return 0;
	if(carsprice[DataCount_2].option_price[1]==NULL)
		return 0;
	if(carsprice[DataCount_2].option_price[2]==NULL)
		return 0;
	if(carsprice[DataCount_2].option_price[3]==NULL)
		return 0;
	if(carsprice[DataCount_2].option_price[4]==NULL)
		return 0;
	if(carsprice[DataCount_2].option_price[5]==NULL)
		return 0;
	if(carsprice[DataCount_2].option_price[6]==NULL)
		return 0;
	if(carsprice[DataCount_2].option_price[7]==NULL)
		return 0;
	if(carsprice[DataCount_2].option_price[8]==NULL)
		return 0;
	if(carsprice[DataCount_2].option_price[9]==NULL)
		return 0;
	if(carsprice[DataCount_2].option_price[10]==NULL)
		return 0;
	if(carsprice[DataCount_2].option_price[11]==NULL)
		return 0;
	if(carsprice[DataCount_2].option_price[12]==NULL)
		return 0;
	if(carsprice[DataCount_2].option_price[13]==NULL)
		return 0;
	if(carsprice[DataCount_2].option_price[14]==NULL)
		return 0;
	if(carsprice[DataCount_2].option_price[15]==NULL)
		return 0;

	fclose(fp2); 
}

CSVファイルの内容です。
1010,850000,95000,,76000,,10000,16000,16000,,,91000,,,72000,66000,38000,29000
1020,780000,14000,37000,87000,90000,49000,30000,3000,,4000,,38000,78000,,,77000,
1030,680000,24000,73000,32000,63000,72000,41000,40000,,67000,50000,,82000,19000,,34000,
1040,1060000,65000,,69000,85000,,85000,,,,38000,,,1000,89000,24000,14000
1050,1420000,86000,65000,62000,,33000,62000,37000,47000,,0,82000,79000,48000,3000,72000,
1060,1220000,3000,91000,80000,75000,,99000,,81000,67000,51000,,54000,,15000,46000,92000
1070,760000,19000,96000,40000,94000,98000,,56000,,86000,5000,52000,,40000,42000,,
1080,1030000,98000,,56000,,,,,16000,97000,,26000,,29000,20000,9000,72000
1090,800000,67000,,44000,49000,,63000,,57000,31000,,25000,64000,42000,97000,36000,97000
1100,1390000,,,,39000,88000,88000,39000,70000,,26000,,,75000,45000,42000,17000
1110,530000,25000,,62000,,,,62000,1000,,47000,,,71000,37000,56000,10000

non
記事: 1097
登録日時: 9年前

Re: CSVファイルを読み込んで構造体に登録したいです。

#2

投稿記事 by non » 6年前

最近
#include "csv_lib.h"
#include "csv_struct.h"
このヘッダーファイルをよく見るような気がします。どんな内容なのでしょうか?

sscanfを使わないで分解しないと無理なんじゃないでしょうか。私はscanfは好きではないので、凝った使い方をしたことがないので
もしかしたら可能なのかも知れないけど。

実験用のサンプルです

コード:

int main(void){
 
	char str[]="1010,850000,95000,,76000,,10000,16000,16000,,,91000,,,72000,66000,38000,29000";
	char *tp;
	int a[18]; 
	int i=0;
	tp=str;
	a[i++]=atoi(tp);
	while(*tp){
		if(*tp==',')
			a[i++]=atoi(tp+1);
		tp++;
	}
	for(i=0;i<18;i++)
		printf("%d\n",a[i]);
}
non

アバター
usao
記事: 1566
登録日時: 6年前

Re: CSVファイルを読み込んで構造体に登録したいです。

#3

投稿記事 by usao » 6年前

>なかなかうまくいきません。
何がどう うまくいかない のでしょうか?
>どなたか間違いがありましたら
間違いがあるのかないのかすら不明,ということですか??


なんか1行の内容を区切るのを頑張ってみた

コード:

//文字列rStrを,delimietersに含まれる文字で区切り,結果をpDstList末尾に追加する.
//追加した文字列の個数を返す.
//bEraseEmptyWordがfalseであれば,結果に空文字列を含む.
// 例えば,delimiters=","で,rStr=",ABC,,D,"の場合,[空文字列,"ABC",空文字列,"D",空文字列]なる結果を作る.
//bEraseEmptyWordにtrueを指定した場合,空文字列は結果から取り除かれる.
unsigned int String2Words( const std::string &rStr, std::list<std::string> *pDstList, bool bEraseEmptyWord/*=true*/, const std::string &delimiters/*=", \t\n\r"*/ )
{
    if( rStr.empty() || pDstList==NULL )return 0;
    unsigned int ret = 0;
    std::string::size_type i = 0;
    bool loop = true;
    while( loop )
    {
        std::string::size_type first = rStr.find_first_of( delimiters, i );
        if( first == std::string::npos )
        {
            first = rStr.length();
            loop = false;
        }
        std::string::size_type len = first - i;
        std::string word = rStr.substr(i,len);
        if( !( word.empty() && bEraseEmptyWord ) )
        {
            pDstList->push_back( rStr.substr(i,len) );
            ret++;
        }
        i = first + 1;
    }
    return ret;
}

sou

Re: CSVファイルを読み込んで構造体に登録したいです。

#4

投稿記事 by sou » 6年前

nonさん、usaoさんありがとうございます!
理解できました!感謝します!

閉鎖

“C言語何でも質問掲示板” へ戻る