iT邦幫忙

0

C語言,如何拆解文字檔段落,分別令存成不同檔案

  • 分享至 

  • xImage

情境說明:小弟公司於不同地點有零售通路,須將零售系統上傳之銷售資料倒入BI。
問題概述:各店端上傳到總公司的資料為文字檔,而且各資料合併成一個檔案,現在碰到需要將內容分段落拆解成不同檔案,由於系統每天上傳,需要能每天抓最新文字檔拆解,再餵給BI吃進去分析。

說明:需要將文字檔中各TABLES和欄位、值拆成獨立檔案。

文字檔檔名:XXX_OOOOOOOOOO_XX
檔明說明:XXX是店代號,OOOO西元年月日流水,XX是檔案代碼
文字檔內容:

TABLES1
欄位一 欄位二 欄位三
值1 值2 值3
TABLES2
欄位一 欄位二 欄位三
值1 值2 值3
TABLES3
欄位一 欄位二 欄位三
值1 值2 值3

小弟現在想到的是,先開檔讀入TABLES1 和 TABLES2 名稱當作起始與結束。
併將內容另存成:XXX_OOOOOOOOOO_TablesName。
但是另存的內容又不能包含到 TABLES2的名稱。
要如何抓資料中最新的檔案名稱然後開檔呢?

TABLES1
欄位一 欄位二 欄位三
值1 值2 值3

該用哪些函數可以達到阿~ 請協助指點迷津。

看更多先前的討論...收起先前的討論...
chenry iT邦新手 5 級 ‧ 2014-12-19 11:40:11 檢舉
void main(void)
{
	 FILE *file_in=fopen("test.txt","r"); 
	 FILE *file_out=fopen("out.txt","w");
 char str,arr[50];
 int s=0,e,count=0; 

//catch start mark
	for (s=0;s <=50;s++){
		if((str=getc(file_in))!=EOF){
		arr[s]=str;
			if (arr[s] =='N'){
			e=s;
			s=51;//jump out
			}
		}
	}
	s=0;
//write into file
	for (s=e;s <=50;s++){
		if((str=getc(file_in))!=EOF){
		arr[s]=str;
			if (arr[s] !='X'){
			putc(arr[s],file_out);
			printf("%c",arr[s]);
			}else{
			s=51;//jump out
			}
		}
	}

fclose(file_in);
fclose(file_out);
printf("File Copy Finish!");
}

chenry iT邦新手 5 級 ‧ 2014-12-19 11:41:59 檢舉
按我程式內容應抓出N與X中間的BBB、AAA。
測試過程產出檔案,BBB的上方皆有一行空白,是否為段行字元,該如何消除?
請先進指點
來源檔內容==========
START
N
BBB
AAA
X
CCA
============
wiseguy iT邦超人 1 級 ‧ 2014-12-20 16:39:28 檢舉
第 13 行改為
e=s+1;

跳過 N 後面的換行字元。
chenry iT邦新手 5 級 ‧ 2014-12-20 22:49:47 檢舉
W大:

增加還是會有空白一行,小弟使用LINUX 編輯。
chenry iT邦新手 5 級 ‧ 2014-12-20 22:50:22 檢舉
chenry iT邦新手 5 級 ‧ 2014-12-20 22:54:26 檢舉
我測試有發現到putc不會去抓換行字元的樣子
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

4
wiseguy
iT邦超人 1 級 ‧ 2014-12-14 10:43:09
最佳解答
  1. 開啟原始檔 fopen()
  2. 開啟暫存檔 fopen()
  3. 讀入原始檔 3 行 fgets()
  4. 用讀入的第 1 行內容產生檔名 sprintf()
  5. 把 3 行寫到暫存檔 fputs()
  6. 關閉暫存檔 fclose()
  7. 把暫存檔改名為第 4 步產生的新檔名 rename()
  8. 回到第 2 步繼續下一個段落,直到讀完原始檔 for()
  9. 關閉原始檔 fclose()
chenry iT邦新手 5 級 ‧ 2014-12-16 12:06:27 檢舉


小弟試試先
感謝

我要發表回答

立即登入回答