gpt4 book ai didi

perl - 只从 perl 中的列表中获取某些值

转载 作者:行者123 更新时间:2023-12-05 00:52:26 24 4
gpt4 key购买 nike

首先我会描述我有什么,然后是问题。

我有一个这样结构的文本文件

----------- Start of file-----
<!-->
name,name2,ignore,name4,jojobjim,name3,name6,name9,pop
-->
<csv counter="1">
1,2,3,1,6,8,2,8,2,
2,6,5,1,5,8,7,7,9,
1,4,3,1,2,8,9,3,4,
4,1,6,1,5,6,5,2,9
</csv>
-------- END OF FILE-----------

我还有一个带有 map 的 perl 程序:

 my %column_mapping = (
"name" => 'name',
"name1" => 'name_1',
"name2" => 'name_2',
"name3" => 'name_3',
"name4" => 'name_4',
"name5" => 'name_5',
"name6" => 'name_6',
"name7" => 'name_7',
"name9" => 'name_9',
)

我的动态插入语句(假设我正确连接到数据库,headers 是我的标题名称数组,例如 test1、test2 等)

my $sql = sprintf 'INSERT INTO tablename ( %s ) VALUES ( %s )',
join( ',', map { $column_mapping{$_} } @headers ),
join( ',', ('?') x scalar @headers );

my $sth = $dbh->prepare($sql);

现在针对我实际遇到的问题:我需要一种方法来只对标题和 map 中的值进行插入。在作为示例给出的数据文件中,有几个名称不在 map 中,有没有办法可以忽略它们以及 csv 部分中与它们关联的数字?

基本上是制作一个 csv 子集,将其变成:

name,name2,name4,name3,name6,name9,
1,2,1,8,2,8,
2,6,1,8,7,7,
1,4,1,8,9,3,
4,1,1,6,5,2,

这样我的插入语句将只插入 map 中的那些。数据文件总是不同的,并且顺序不一样, map 中会有未知数量。

理想情况下,这是执行此操作的有效方法,因为此脚本将遍历数千个文件,并且每个文件都位于具有数百列的 csv 的数百万行之后。

它只是一个正在读取的文本文件,而不是 csv,不确定 csv 库是否可以在这种情况下工作。

最佳答案

您通常会将有效索引集放在列表中并使用 array slices之后。

@valid = grep { defined($column_mapping{ $headers[$_] }) } 0 .. $#headers;

...

my $sql = sprintf 'INSERT INTO tablename ( %s ) VALUES ( %s )',
join( ',', map { $column_mapping{$_} } @headers[@valid] ),
join( ',', ('?') x scalar @valid);
my $sth = $dbh->prepare($sql);

...

my @row = split /,/, <INPUT>;
$sth->execute( @row[@valid] );

...

关于perl - 只从 perl 中的列表中获取某些值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31841529/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com