[問題] 分批讀取大量資料的.txt檔(問題更新)
各位版友好,小弟本身是非資工背景的學生,而且才剛接觸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: (請善用置底文標色功能)
以下是經由Dannvix大大所提供的code所修改的,
目前已經可以經由判讀第一欄位是否為所需數值來取值,
但小弟這邊又有個疑問,如果是想判斷第二欄位或是第三欄位的數值,
那應該如何改寫strncmp,小弟試了幾次都不行,甚致如果要更進一步,
比如說取該列的第一欄跟第三欄的數值來比較(大小or是否相等之類)後,
再決定是否取值,請問有版友有想法的嗎?
#include <stdio.h>
#include <string.h>
#define MAX_LEN (200)
#define TARGET "1.0"
#define TARGET1 "2.35"
int main (void)
{
FILE *fd_in = fopen("input.txt", "r");
FILE *fd_out = fopen("output.txt", "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);
if (strncmp(buf, TARGET1, strlen(TARGET1)) == 0)
fputs(buf, fd_out);
}
fclose(fd_in);
fclose(fd_out);
return 0;
}
補充說明:
因為小弟真的已經沒辦法,所以才會這樣沒頭沒腦的問問題,
希望各位版友見諒,在此先感謝版友耐心的看完,如果有想法
麻煩請您與我分享,小弟感激不盡。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.118.38.150
→
05/15 02:27, , 1F
05/15 02:27, 1F
小弟是寫C,完整的程式碼因為沒有頭緒,所以還沒寫出來
推
05/15 02:28, , 2F
05/15 02:28, 2F
謝謝,小弟下次會注意
※ 編輯: Bigbawan 來自: 140.118.38.150 (05/15 02:48)
推
05/15 03:23, , 3F
05/15 03:23, 3F
推
05/15 03:27, , 4F
05/15 03:27, 4F
想請教一下大大,如果一行一行讀要用什麼語法?
※ 編輯: Bigbawan 來自: 140.118.38.150 (05/15 03:53)
※ 編輯: Bigbawan 來自: 140.118.38.150 (05/15 04:43)
※ 編輯: Bigbawan 來自: 140.118.38.150 (05/15 04:46)
推
05/15 09:11, , 5F
05/15 09:11, 5F
推
05/15 09:16, , 6F
05/15 09:16, 6F
推
05/15 09:28, , 7F
05/15 09:28, 7F
※ 編輯: Bigbawan 來自: 140.118.38.150 (05/16 00:17)
推
05/16 02:18, , 8F
05/16 02:18, 8F
→
05/16 02:34, , 9F
05/16 02:34, 9F
→
05/16 02:35, , 10F
05/16 02:35, 10F