2009-08-06 135 views
3

我有多個文件夾。這些文件夾中有多個txt文件。我需要提取數據(只是一個單一的值:值---> 554)。從特定類型此文件夾中的txt文件的(individual_values.txt如何將文本文件中的數據導入到Excel中?

No 100 Value 555  level match 0.443  top level 0.443  bottom 4343 

會有用相同的txt文件的名稱很多文件夾,但差異值。所有這些值都可以被複制到下一個之下。

我必須從上面提到的txt文件中提取一個值。它是一個具有相同名稱的文本文件,位於不同的文件夾中。我想要做的就是從所有文本文件中提取此值,並將其粘貼到每行中的另一個下方的excel或txt中。

例如:上面是一個文本文件,我必須得到555的值,並且類似於其他差異值。

555 

666 

666 

776 
+4

你的問題太具體。你想要示例代碼?如果是這樣,什麼語言?這是第一個文本示例是您正在使用的文本文件的精確表示嗎? – Triptych 2009-08-06 21:01:22

+0

接下來你想做什麼? (在「Like This」表之後) – pageman 2009-08-06 21:01:54

+3

「家庭作業」標籤之後,我預測第二個最受歡迎的標籤將是「爲我工作」。 – Ether 2009-08-06 23:24:25

回答

8

是的。

(你可能想澄清你的問題)

+4

+1因爲我咯咯笑了。 – Triptych 2009-08-06 21:00:44

+0

+1 sarnath'd hehehe – pageman 2009-08-06 21:01:10

+0

恕我直言,這應該是被接受的答案。 – Ether 2009-08-06 23:23:40

0

只是確保你有一個50/50的機會得到正確的答案

(假設它是由一個交代問題是和否)hehehe

+0

儘管我必須承認這很有趣,但這不是很有用:) – 2009-08-06 21:05:24

5

你的問題不是很清楚,我想你想知道如何做到這一點。

您可能需要編寫遍歷文件夾的腳本,讀取單個文件,解析它們以獲取所需的值,並生成一個Comma Separated Values(CSV)文件。 CSV文件可以輕鬆導入Excel。

0

File_not_found

得到所有三個響應的二進制狀態。

4

您可以使用兩種或三種基本方法將內容獲取到Excel電子表格中。

  • 您可以使用OLE包裝來操作Excel。
  • 您可以用二進制形式編寫文件
  • 您可以使用Excel的導入方法將分隔文本作爲電子表格。

我選擇了後一種方式,因爲1)它是最簡單的,2)你的問題陳述得很差,因爲它不需要更復雜的方法。下面的解決方案輸出Excel可輕鬆支持的製表符分隔文本文件。

在Perl:

use IO::File; 

my @field_names = split m|/|, 'No/Value/level match/top level/bottom'; 
#' # <-- catch runaway quote 

my $input = IO::File->new('<data.txt'); 
die 'Could not open data.txt for input!' unless $input; 

my @data_rows; 
while (my $line = <$input>) { 
    my %fields = $line =~ /(level match|top level|bottom|Value|No)\s+(\d+\S*)/g; 
    push @data_rows, \%fields if exists $fields{Value}; 
} 

$input->close(); 

my $tab_file = IO::File->new('>data.tab'); 
die 'Could not open data.tab for output!' unless $tab_file; 

$tab_file->print(join("\t", @field_names), "\n"); 
foreach my $data_ref (@data) { 
    $tab_file->print(join("\t", @$data_ref{@field_names}), "\n"); 
} 

$tab_file->close(); 

注: Excel的文本處理真的是相當整潔。嘗試打開下面的文本(更換\t與實際標籤) - 甚至複製和粘貼:

1\t2\t3\t=SUM(A1:C1)

+2

事實上,這是我最不喜歡的方法,因爲Excel不可避免地會在某個時刻破壞您的某些數據。郵政編碼將會變成數字(如果郵局沒有路由到7030,那麼郵政編碼會很難...正確的郵政編碼是07030,或者網絡編號會變成日期(即數字)。在不同的大學,網絡編號由個人首字母組成。所以,* Joan Arc Nonce *最終可能會有一個網絡標識'jan23',它今年會轉換爲'39836',最好在寫入Excel要使用的數據時使用'Spreadsheet :: WriteExcel'。獨立於引導 – 2009-08-06 22:07:25

+0

順便說一下,我沒有downvote你的答案,我不認爲有任何理由downvote這個答案。這是一個更好的回答比OP值得。+1。 – 2009-08-06 22:31:40

+0

@Sinan,這些都是好點,但我認爲它們都可以通過預先等待處理「單元格」文本來處理,因爲這裏的數據都是文本和整數以及浮點數,所以應該足夠了。 – Axeman 2009-08-07 15:04:45

1

我選擇C#,因爲我認爲這將是有趣的使用遞歸的λ。這將創建包含與正則表達式模式匹配的csv文件。

string root_path = @"c:\Temp\test"; 
    string match_filename = "test.txt"; 

    Func<string,string,StringBuilder, StringBuilder> getdata = null; 

    getdata = (path,filename,content) => { 
     Directory.GetFiles(path) 
     .Where(f=> 
      Path.GetFileName(f) 
      .Equals(filename,StringComparison.OrdinalIgnoreCase)) 
     .Select(f=>File.ReadAllText(f)) 
     .Select(c=> Regex.Match(c, @"value[\s\t]*(\d+)", 
      RegexOptions.IgnoreCase)) 
     .Where(m=>m.Success) 
     .Select(m=>m.Groups[1].Value) 
     .ToList() 
     .ForEach(m=>content.AppendLine(m)); 
     Directory.GetDirectories(path) 
      .ToList() 
      .ForEach(d=>getdata(d,filename,content)); 
       return content; 
    }; 
    File.WriteAllText(
     Path.Combine(root_path, "data.csv"), 
     getdata(root_path, match_filename, new StringBuilder()).ToString()); 
相關問題