2009-08-06 104 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()); 
相关问题