【问题标题】:How does perl process a csv fileperl如何处理一个csv文件
【发布时间】:2013-06-24 01:22:33
【问题描述】:
  while ( <IN_FILE> )
  {
    chomp;
    # do some processing

  }
  1. Perl 是如何处理文件的,是不是通常的逐行处理?
  2. 什么是线?如果它正在读取 csv 文件怎么办?
  3. 例如,当我编辑在 Windows 上的记事本中打开的 csv 文件时,在关闭自动换行的情况下,它只是一个巨大的文本块,大约有 30 行文本,它们在同一个位置中断,所以我假设那是因为它达到了行限制的末尾,我相信每行 1024 个字符?
  4. 那么 perl 将如何解析它呢?
  5. 它被视为一个语句还是什么,是否有换行符?

【问题讨论】:

  • 问题太多了。
  • Perl 做任何 告诉它做的事情。如果您正在处理 CSV 文件,您应该查看 CPAN 中的 Text::CSV 模块:search.cpan.org/~makamaka/Text-CSV-1.32/lib/Text/CSV.pm
  • @HunterMcMillen:与特定版本甚至特定作者无关的永久链接是search.cpan.org/dist/Text-CSV 对于阅读此问题数月或数年的人来说,该链接将始终指向最新/最好的路。
  • 更好的是,metacpan 链接提供了永久链接——链接的版本和最新的。例如metacpan.org/module/Text::CSV#SYNOPSIS的左侧
  • @AndyLester 我的错误,我从 Google 获取了第一个 URL,假设它是直接的。

标签: perl csv


【解决方案1】:

Perl 像处理任何其他文本文件一样处理 CSV 文件。

您的文件在记事本中看起来很有趣,因为您的文件是在 Unix 上创建的,并且具有 Unix 行结尾(仅限 \n)。记事本期望 Windows 行结束(\r\n(或者相反?))。在 Windows 上使用写字板或更高级的编辑器来查看 Unix 行结束。更好的是,在 Unix 编辑器中查看您的文件。

【讨论】:

    【解决方案2】:
    1. 是的

    2. 行是一些以“行尾”字符结尾的字符。 perl 中用于行尾字符的符号是\n。大多数文件读取操作“知道”行尾字符并相应地进行操作

    3. 行长不重要

    4. perl 会通过将特殊变量$_ 设置为从文件中读取的当前行来解析您的骨架代码。然后,如果它是 csv,您可以读取转换字段,类似 my @fields = split(/,/,$_) $field[0] 将是该行中的第一个 csv 项,而 $field[1] 将是第二个,依此类推。 perl 已经准备好了像 Text::CSV 这样的模块,可以让这类事情变得更容易并处理奇怪的情况

    5. perl “理解”换行符并适当地处理它们

    【讨论】:

    • 当在行中读取以 $\ 的值结尾的文本长度时默认为 \n
    • @user1937198 mate, $\ 在处理行输出数据时很重要。你说的很对,它默认为\n
    • @user1937198 再次,你是对的。 $/ 是输入记录分隔符,可用于将默认值从换行更改为其他内容!当然$\ 是未定义的!我在想什么!!我们应该是一个打击犯罪的小队什么的:)
    【解决方案3】:
    1. 使用&lt;IN_FILE&gt; 语法时,是的,逐行。
    2. 可能是由\n 分隔的0 个或多个字符的序列,在某些平台上可能是\r\n。请参阅 @HunterMcMillen 的评论以获取出色的 CSV 建议。
    3. 不要相信 Windows 的记事本 - 有很多原因...请参阅 @Arkadiy 的回答
    4. 比记事本好,像#2一样逐行
    5. 不明白你的意思。如果有换行符,则为行分隔符。

    【讨论】:

      【解决方案4】:

      我将回答更广泛的问题,“如何在 Perl 中处理 CSV 文件” - 有很多答案,但更常见的方法之一是“使用 Text::CSV 模块"

      https://metacpan.org/module/Text::CSV#SYNOPSIS 上有大量示例代码,但举个更简短的例子,这是我今天下午在工作中所做的:

      # now we expect a CSV file on STDIN
      while (<>) {
        $csv->parse($_);
      
        # grab the field values
        my ( $agreement, $debt_id, $client_id, $campaign_id ) = $csv->fields();
        # less interesting code goes here
      }
      

      很多人已经解决了您的具体问题,但如果您的问题是“我如何处理此 CSV”,那么无论字段内的换行符/逗号等如何,这应该都能正常工作。

      至于文件中缺少换行符 - 正如其他人所说,这可能只是 Windows/Unix 行尾问题。只要它们是一致的(看起来它们是一致的——它们都不能在 Windows 上运行!)你没问题。

      【讨论】:

        猜你喜欢
        • 2012-05-12
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        • 2011-03-09
        • 1970-01-01
        • 2020-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多