作者Dannvix (Dannvix)
看板C_and_CPP
標題Re: [問題] 分批讀取大量資料的.txt檔
時間Sat May 15 13:21:32 2010
以下是 Code 附上註解,由於浮點數比較會有誤差,所以直接比較字串
另外,我假定你的輸入資料中是沒有那個框框、每行的開頭也沒有空白
// 若格式不同則修改對應的 TARGET 即可
#include <stdio.h>
#include <string.h>
#define MAX_LEN (200)
#define TARGET "6.9"
int main (void)
{
FILE *fd_in = fopen("input", "r");
FILE *fd_out = fopen("output", "w");
char buf[MAX_LEN], *ptr;
/* 處理第一行 (欄位名稱) */
fgets(buf, MAX_LEN, fd_in);
fputs(buf, fd_out);
/* 使用 while + feof() 來處理未知筆數的資料 */
while (!feof(fd_in)) {
/* 讀一整行進來 */
fgets(buf, MAX_LEN, fd_in);
/* 檢查第一個數字是否為我們想要的 */
/* 如果是的話,就照原樣輸出 */
if (strncmp(buf, TARGET, strlen(TARGET)) == 0)
fputs(buf, fd_out);
}
fclose(fd_in);
fclose(fd_out);
return 0;
}
※ 引述《Bigbawan (~大肉圓~)》之銘言:
: 各位版友好,小弟本身是非資工背景的學生,而且才剛接觸C語言,
: 因為一時興起去跨修電資學院的課,現在遇到了程式上的問題,
: 希望版上的朋友給點建議。
: 遇到的問題: (題意請描述清楚)
: 小弟想撰寫一個讀取.txt檔的程式,檔案內容如下,
: EX:以下是abc.txt的資料
: --------------------------------------
: | aaa bbb ccc ddd |此列為數據名稱
: | 6.9 dsfs 1.0 3.68 |
: | 6.9 sds 1.0 3.68 |
: | 6.9 vbs 1.0 3.68 |
: | 1.3 vbb 2.35 2.914 |
: | 6.9 2vbv 1.0 3.68 |
: --------------------------------------
: 數字 文字+數字 數字 數字
: 此資料約80多萬筆(列),且其中包含純數字或是文字+數字的欄位。
: 希望得到的正確結果:
: 抽取符合aaa行數值為6.9的所有列,
: 並將其顯示成如原本的檔案格式,
: EX:以下是abc.txt的資料
: --------------------------------------
: | aaa bbb ccc ddd |此列為數據名稱
: | 6.9 dsfs 1.0 3.68 |
: | 6.9 sds 1.0 3.68 |
: | 6.9 vbs 1.0 3.68 |
: | 6.9 2vbv 1.0 3.68 |
: | 6.9 sdsS 1.0 3.68 |
: | 6.9 vSDD 1.0 3.68 |
: | 6.9 2DSv 1.0 3.68 |
: | . |
: | . |
: | . |
: | . |
: --------------------------------------
: 程式跑出來的錯誤結果:
: 小弟有嘗試用Dev-C++撰寫開檔程式,但是參考版上的CODE,
: 再編譯時using namespace std就出現問題,
: #include <iostream>
: #include <fstream>
: using namespace std;
: 不知道是小弟哪裡設定錯誤。
: 之前有用過fopen就可以開啟,但是因為筆數太多吃近來也沒意義,
: 不知道能否像小弟提出的想法讀取。
: 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux)
: Dev-C++
: 有問題的code: (請善用置底文標色功能)
: 這是小弟爬文後試出來比較接近我要的程式
: #include<stdio.h>
: #include<stdlib.h>
: int main()
: {
: int line[6];
: FILE *inp = fopen ("input.txt", "r");
: FILE *outp = fopen ("output.txt", "w");
: if(inp != NULL)
: {
: for(int i=0;i<6;i++)
: {
: fscanf(inp,"%d", &line[i]);
: }
: fprintf(outp,"%d", line[2]);
: }
: fclose (inp);
: fclose (outp);
: return 0;
: }
: 雖然可以將指定的列取出,但小弟還是不知道如何加判斷式讓程式自行取出想要的列。
: 還有因為筆數過多,小弟也無法精準的知道是幾列,那要如何令i值,有辦法讓程式自行
: 判斷上限嗎?
: 補充說明:
: 因為小弟真的已經沒辦法,所以才會這樣沒頭沒腦的問問題,
: 希望各位版友見諒,在此先感謝版友耐心的看完,如果有想法
: 麻煩請您與我分享,小弟感激不盡。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.227.84.109
※ 編輯: Dannvix 來自: 125.227.84.109 (05/15 13:28)
推 Bigbawan:感謝大大熱心教學,小弟趕快來測設一下^^ 05/15 22:29
推 Bigbawan:小弟已經成功抓取資料,也成功嘗試多筆TARGET來取值 05/15 23:44
推 Bigbawan:D大小弟友新的問題,已在原文提出,如您有空,煩請撥空看 05/16 00:19
→ Bigbawan:看,看是否能給小弟一點建議,感謝您 05/16 00:19
→ Bigbawan:在(有問題的code:)之後有提出問題點 05/16 00:20
→ Dannvix:原文下面有人推文提出正解了 就是用指標往後指 05/16 13:01
推 Bigbawan:感謝D大回覆 ^^ 05/16 16:45