0
  while ( <IN_FILE> )
  {
    chomp;
    # do some processing

  }
  1. how does Perl process a file, is it the usual line by line?
  2. what constitutes a line? What if it's reading a csv file?
  3. When I edit a csv file which opens in notepad on windows for example, with word wrap off it's just a huge block of text, there are about 30 lines of text and they break off at the same spot so I'm assuming thats because it reached the end of the row limit which is something like 1024 chars per line I believe?
  4. So how would perl parse that?
  5. Is it treated as one statement or what, are there are newline chars?
4

4 回答 4

1
  1. 是的

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

  3. 行长并不重要

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

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

于 2013-06-26T18:49:07.807 回答
1

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

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

于 2013-06-26T18:43:59.033 回答
0
  1. 使用<IN_FILE>语法时,是的,逐行。
  2. 可能是由 0 个或多个字符组成的序列,由 a 分隔\n,可能\r\n在某些平台上。请参阅@HunterMcMillen 的评论以获取出色的 CSV 建议。
  3. 不要相信 Windows 的记事本 - 有很多原因......请参阅@Arkadiy 的回答
  4. 比记事本好,像#2那样逐行
  5. 不知道你的意思。如果有换行符,它将是行分隔符。
于 2013-06-26T18:45:39.657 回答
0

我将回答更广泛的问题,“如何在 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 上工作!)你没问题。

于 2013-06-26T19:00:59.470 回答