Perl - 格式输出和读取格式化数据

时间:2016-02-09 09:08:06

标签: perl csv format

我正在尝试将一些数据写入CSV文件并回读这些数据。为了更好的可读性,我使用Perl格式创建了一个类似于表的外观,并且当在Excel中打开时,数据显示在适当的列中,我使用逗号分隔列。我的表是ID列表及其各自的属性。以下是我用来显示每个ID的格式:

format TABLE = 
@<<<<<, ^<<<<<<<<<<<<<<, ^<<<<, @<<<<, @<<<<<
$ID,   $description,    $att,  $errors, $location
      , ^<<<<<<<<<<<<<<, ^<<<<,
       $description,    $att
      , ^<<<<<<<<<<<<<<, ^<<<<,
       $description,    $att
      , ^<<<<<<<<<<<<<<
      $description
      , ^<<<<<<<<<<<<<<
      $description
.

我使用此格式时遇到的问题是保留显示$description$att的行数是固定的。如果我的字符串长于被截断的字符串,如果短于5行,则总会显示空行。由于$description字符串的长度是不可预测的,有没有办法确保内容完全显示,即使它更长并且没有尾随空行,即使它比格式中指定行的数量短?

当前输出:

13_456, this is a examp, val1:, 3    , fold1
      , le of a line th, x; va,
      , at if follow th, l2: y,
      , e current forma,
      , t would be trun,

12_456, this is a short, val1:, 0    , fold2
      ,  description   , a; va,
      ,                , l2: b,
      ,                ,
      ,                ,

期望的输出:

13_456, this is a examp, val1:, 3    , fold1
      , le of a line th, x; va,
      , at if follow th, l2: y,
      , e current forma,
      , t would be trun,
      , cated          ,

12_456, this is a short, val1:, 0    , fold2
      ,  description   , a; va,
      ,                , l2: b,

为了从文件中读取,我能够逐行解析文件以匹配$ID模式,并检索该ID的所有信息($description$att,{{ 1}},$errors)。但是由于我使用Perl格式打印数据,我只是想知道我是否可以使用这种格式来读回数据,即Perl是否提供了有助于读取符合指定Perl格式的数据的任何库/功能?我做了一些研究,但似乎没有找到一个,非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我上次查看format后大约五年了,但我认为您需要的是自动重复标记~~,表示应重新使用格式行直到变量被清空

您已经很难写出有效的内容,因为您没有给我们任何数据,并且您显示的格式声明无法生成该输出,因为字段宽度不同。您还必须与$:$FORMAT_LINE_BREAK_CHARACTERS)混淆,以使您的输出分组,但您没有提及

这里有一些代码可以生成您要求的内容,但限制输出行数除外。您无法进行多行自动填充以及限制行数,如果超出substr,您似乎需要使用$description来限制use strict; use warnings 'all'; my ( $ID, $description, $att, $errors, $location ); format STDOUT = @<<<<<, ^<<<<<<<<<<<<<<, ^<<<<, @<<<<, @<<<<< $ID, $description, $att, $errors, $location , ^<<<<<<<<<<<<<<, ^<<<<, ~~ $description, $att . local $:; ( $ID, $description, $att, $errors, $location ) = ( '13_456', 'this is a example of a line that if follow the current format would be truncated at the end of the fifth line', 'val1:x; va12: y', 3, 'fold1', ); write STDOUT; ( $ID, $description, $att, $errors, $location ) = ( '12_456', 'this is a shortdescription', 'val1:a; val2: b', 3, 'fold2', ); write STDOUT; 的长度75个字符(5行,15个字符)

13_456, this is a examp, val1:, 3    , fold1
      , le of a line th, x; va,
      , at if follow th, 12: y,
      , e current forma,      ,
      , t would be trun,      ,
      , cated at the en,      ,
      , d of the fifth ,      ,
      , line           ,      ,

12_456, this is a short, val1:, 3    , fold2
      , description    , a; va,
      ,                , l2: b,

输出

var $animation_elements = $('.animation-element');
var $window = $(window);

function check_if_in_view() {
  var window_height = $window.height();
  var window_top_position = $window.scrollTop();
  var window_bottom_position = (window_top_position + window_height);

  $.each($animation_elements, function() {
    var $element = $(this);
    var element_height = $element.outerHeight();
    var element_top_position = $element.offset().top;
    var element_bottom_position = (element_top_position + element_height);

    //check to see if this current container is within viewport
    if ((element_bottom_position >= window_top_position) &&
        (element_top_position <= window_bottom_position)) {
      $element.addClass('in-view');
    } else {
      $element.removeClass('in-view');
    }
  });
}

$window.on('scroll resize', check_if_in_view);
$window.trigger('scroll');

答案 1 :(得分:-2)

不要试图重新发明轮子,使用专门用于手头任务的模块:Text::CSV