首先我会描述我所拥有的,然后是问题。
我有一个这样构造的文本文件
----------- 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-----------
我还有一个带有地图的 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);
现在对于我实际上遇到的问题:
我需要一种方法来仅对标题和地图中的值进行插入。
在作为示例给出的数据文件中,有几个名称不在地图中,有没有办法可以忽略它们以及 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,
这样我的插入语句只会插入地图中的内容。数据文件总是不同的,并且顺序不一样,地图中会有未知的数量。
理想情况下,这是一种有效的方法,因为该脚本将遍历数千个文件,并且每个文件都位于 csv 的数百万行和数百列之后。
它只是一个正在读取的文本文件,而不是 csv,不确定 csv 库是否可以在这种情况下工作。