【问题标题】:Split large text file by date field and save as Month [closed]按日期字段拆分大文本文件并另存为月份 [关闭]
【发布时间】:2013-06-21 20:11:09
【问题描述】:

我有从 400mb 到 1GB 的大文本文件。

它是一个制表符分隔的文件,日期是第二个字段。记录不按日期排序,可以按任何顺序排列。

记录的数量和期限因文件而异

文本文件中的每条记录都有一个日期字段,格式为14/02/2012(即dd/mm/yyyy)。我想按日期拆分文本文件并保存为 Month.txt(例如 2012Jan.txt)。

Jan.txt 文件应仅包含1st Jan 201231st Jan 2012 期间的记录。

最好的方法是什么?请有人推荐一个代码/编程工具来实现这一点。

谢谢

【问题讨论】:

  • 我建议您编写代码并在遇到问题时提出问题。就个人而言,我会使用 Java,但语言取决于您。 :D
  • 如果每条记录都在一行,并且您不熟悉编程,您可以使用 grep。
  • 我只是打开文件,逐行读取。从行中读取“月”,检查“月”是否已打开文件 - 如果它未打开,则打开它以进行写入并在那里存储行。最后,您应该关闭所有文件。 (希望您不会达到打开文件的系统限制)
  • 如果您在 Windows 上可以使用 .NET (Visual Studio Express),在我看来文件处理非常容易。也许你甚至可以在一些办公产品(excel/word/access)中编写一个宏。
  • 老实说,现在 1GB 并不是很大。您可以轻松地将其读入内存,对其进行排序,然后在执行过程中循环创建文件。如果您没有足够的 RAM,请打开文件,逐行读取,然后将每一行附加到相应的文件中。

标签: text split


【解决方案1】:

在 Windows .BAT 文件中,每个输出文件中都有标头:

awk "NR==1{header=$0};NR>1{split($2,date,\"/\");file=date[3]strftime(\"%%b.txt\",(date[2]-1)*31*24*60*60);if(!wrote[file]++)print header>file;print>file}" %1

(此处您将输入文件的名称作为参数传递给 .BAT 调用;如果始终是同一个文件,您可以将 %1 更改为该文件名)

【讨论】:

【解决方案2】:

在 UNIX 外壳中:

awk 'NR>1{split($2,date,"/");print>date[3]strftime("%b.txt",(date[2]-1)*31*24*60*60)}' large.txt

在 Windows CMD 外壳中:

awk "NR>1{split($2,date,\"/\");print>date[3]strftime(\"%b.txt\",(date[2]-1)*31*24*60*60)}" large.txt

在 Windows .BAT 文件中:

awk "NR>1{split($2,date,\"/\");print>date[3]strftime(\"%%b.txt\",(date[2]-1)*31*24*60*60)}" large.txt

(假设您的文件名为large.txt

【讨论】:

  • 您好 Armali,感谢您的代码。但是,当我运行代码时,我收到以下错误“awk:(FILENAME=1.txt FNR=1)致命错误:内部错误(SIGSEGV)此应用程序已请求运行时以不寻常的方式终止它。请联系应用程序的支持团队了解更多信息。”在 Win 7、32 位操作系统、4 GB RAM 上运行我做错了吗?还是缺少一些文件?谢谢
  • 您使用的是哪个版本的awk (awk --version)?我使用 GNU Awk 3.1.6(来自gnuwin32.sourceforge.net/packages/gawk.htm)进行了测试。
  • 我从 gnu 站点下载了 AWK。我使用的是 GNU AWK 3.1.6 版本。
  • 嗨 Armali,我猜它可能与管理员权限有关。我试过在另一台机器上运行它,现在它运行了。但是输出并不像预期的那样。 cod 会产生一个名为 2012b 的输出,其中所有记录都与输入文件相同。我希望根据日期将记录输出到不同的 yyyymmm 。现在所有不同的月份都在同一个输出文件中。
  • 这是指您的评论“我从 gnu 站点下载了 AWK。我使用的是 GNU AWK 3.1.6 版本。”:嗯,或者更确切地说,不好,它看起来像 awk 的 GnuWin 端口你的输入文件出现了一个错误(1.txt,我想)。正确的做法是将其报告给错误列表。同时,您可以尝试 GNU Awk 4.1.0(例如来自 klabaster.com/progs/gawk32.zip)。
猜你喜欢
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 2018-02-11
相关资源
最近更新 更多