2012-12-20 32 views
-1

我有一個文本文件,它看起來像這樣:複製列

Flooding refers to all water that overflows a node, whether it ponds or not. 
    -------------------------------------------------------------------------- 
                  Total Maximum 
           Maximum Time of Max  Flood Ponded 
         Hours  Rate Occurrence  Volume  Depth 
    Node     Flooded  CMS days hr:min 10^6 ltr Meters 
    -------------------------------------------------------------------------- 
    1064     0.15  0.000  0 00 00  0.000  0.35 
    1065     0.25  0.078  0 00 09  0.049  0.41 
    1130     0.25  0.626  0 00 00  0.106  0.90 
    1155     0.24  0.098  0 00 07  0.073  0.61 
    1173     0.25  0.106  0 00 15  0.022  0.76 

我想要複製的數值列(無文本),使得生成的文件就像這樣:

1064     0.15  0.000  0 00 00  0.000  0.35 
    1065     0.25  0.078  0 00 09  0.049  0.41 
    1130     0.25  0.626  0 00 00  0.106  0.90 
    1155     0.24  0.098  0 00 07  0.073  0.61 
    1173     0.25  0.106  0 00 15  0.022  0.76 

到現在我已設法在C做此代碼:

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

void main() 
{ 
FILE *fs,*ft; 
int ch; 
int c; 
fs=fopen("node.txt","r"); 
if (fs=NULL) 
{ 
    puts("cannot open source file"); 
    exit(0); 
} 
ft=fopen("new_node.txt","w"); 
do 
{ 
    ch=fgetc(fs); 
    if (ch=EOF) 
    break; 
    else 
    { 
    if (ch>0) 
    fputc(ch,ft); 
    } 
    ch++; 
} 
    while(1); 
    fclose(fs); 
    fclose(ft); 
    return 0; 
} 

的問題是,什麼是走出來的吧。任何人都可以在這方面提供幫助並提供工作代碼。

+0

我會用C以外的其他工具來執行這個任務,比如awk(或者perl,或者python) –

+0

實際上我不知道perl或者python。這就是爲什麼我試圖C.它可能是DOS程序嗎? – krishcal23

+0

以下兩種語言都增加了一些解決方案。如果你不認識他們,就去學習吧!這是值得的時間。此外,恕我直言python很容易拿起 –

回答

1

if (fs=NULL)分配NULLfs而不是比較它們。使用==來測試是否相等,即if (fs==NULL)

這同樣適用於代碼後面的if (ch=EOF)

注有警告編譯啓用,這將可能已經指出了一個條件表達式這個任務。

這些變化將讓您複製源文件的全部內容。如果您只想複製以空格/數字開頭的行,請查看isspaceisdigit。 unwind的使用fgets的建議會使這個更簡單。

+0

我試過ch == EOF但仍然沒有工作。 – krishcal23

+0

你能更具體嗎?有什麼打印出來的?你可以使用調試器逐步完成代碼,或添加printf語句來查看執行哪些代碼? – simonc

+0

該代碼不會打印任何內容。只是我得到一個空白的「new_node.txt」文件。 – krishcal23

1

您的數據顯然是面向行的;它使沒有有意義讀取/寫入數據一次一個字符。

閱讀使用fgets()全行成適宜尺寸的緩衝液(1024個字節,也許)。檢查線路,確定它是否是你想要保留的線路。如果是這樣,請使用fputs()寫出。

0

其實,你的問題很簡單:你不使用正確的工具。事實上,在bash(默認情況下,在大多數Linux發行版和Mac OS X上安裝Windows,安裝cygwinmingw),僅此這項工作:

tail -n +8 copying_columns.data 

這實際上,開始打印的文件第8行,有效地跳過你的標題。 awk提供了更通用的解決方案:

awk 'x >= 2 {print}; /---/ {++x}' copying_columns.data 

就是打印行,如果我們遇到含有---兩個或兩個以上線。在Perl中,這可以給:

perl -ne 'if ($x >= 2) {print $_;} if (/---/){++$x;} 

,或者,如果我們把perl腳本到它自己的文件,copying_columns.perl

#!/usr/bin/perl 
use strict; 
use warnings; 
my $x = 0; 
while (<>){ 
    if ($x >= 2){ 
     print $_; 
    } 
    if (/---/){ 
     ++$x; 
    } 
} 

運行與

perl copying_columns.perl copying_columns.data 

作爲獎勵,在這裏是Python版本:

#!/usr/bin/python 
import sys 
for f in [open(fname, 'rb') for fname in sys.argv[1:]] or [sys.stdin]: 
    x = 0 
    for line in f: 
     if x >= 2: 
      print(line.rstrip('\r\n')) 
     if line.find('---') >= 0: 
      x += 1 
    f.close() 

使用

python copying_columns.py copying_columns.data 

此版本帶有重置輸入文件之間計數器的額外優點。

最後,這裏是我的兩分錢:學習(至少:))其中一種工具:它們非常高效,特別是對於data manipulation