excel - 使用“$csv->print”函数在 Perl 中将 XLSM 文件转换为 CSV 格式?
问题描述
函数 CSV->PRINT 是否只接受数组引用?我将 $cell2_value 推入一个数组,然后打印该数组(即行),如果我可以直接将 $cell2_value 写入一个打开的 CSV 文件,那就太好了。
需要注意的事项——
- 值中有逗号的 Excel 单元格将以双引号打印。
- 值中包含“关键字”的 Excel 单元格将以双引号打印整个单元格的值,而内引号将更改为“关键字”。
我可以编写一个 CSV 文件,其中包含一些不需要的 excel 单元格输出。每当看到 / 或 * 等特殊字符时,它都会插入双引号。
CSV FILE from the below code:-
"CLASS_A,,x,Singapore,,0xABCF00C4,"/* x2-4Rw */",-,,,,,,,Yes,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"CHECK- ""CLASS_B""- WORKED",1,2,3"
"CLASS_A,,,malyaisa,," 3:0","/* ABCVF */",E,,,,,,,Yes,,,,,,,,,,,,,Yes,,,,,,Yes,Yes,Yes,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"
Desired output
CLASS_A,,x,malyaisa,,0xABCF00C4,/* x2-4Rw */,-,,,,,,,Yes,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"CHECK- ""CLASS_B""- WORKED",1,2,3
CLASS_A,,,malyaisa,, 3:0,/* ABCVF */,E,,,,,,,Yes,,,,,,,,,,,,,Yes,,,,,,Yes,Yes,Yes,,,,,,,,,,,,,,,,,,,
为什么它在每一行周围插入引号?有什么办法可以去掉吗?
sub Excel_to_CSV
{
($student_excel_file) = @_;
if($student_excel_file ne "")
{
$student_excel_out_csv_file = $student_excel_file;
$student_excel_out_csv_file =~ s/.xlsm$/_new.csv/;
my $parser_1 = Spreadsheet::ParseXLSX->new();
my $workbook = $parser_1->parse($student_excel_file);
my $csv_1 = Text::CSV->new ({ binary => 1, auto_diag => 1, sep_char => ',' });
open my $fh, ">:encoding(utf-8)", $student_excel_out_csv_file or die "failed to create $student_excel_out_csv_file: $!";
if ( !defined $workbook )
{
die $parser_1->error(), ".\n";
}
my $worksheet=$workbook_->worksheet(0);
my ( $row_min, $row_max ) = $worksheet->row_range();
my ( $col_min, $col_max ) = $worksheet->col_range();
printf("Copyig Sheet: %s from the provided student \n", $worksheet->{Name});
my $concurentEmptyLineCount = 0;
for my $row_1 ( $row_min .. $row_max )
{
my @row_elements_array;
for my $col_1 ( $col_min .. $col_max )
{
my $cell_1 = $worksheet->get_cell( $row_1, 0 );
next unless $cell_1;
$concurentEmptyLineCount=0;
my $cell_2 = $worksheet->get_cell( $row_1, $col_1);
my $cell2_value =$cell_2 -> {Val};
if(defined $cell2_value)
{
push(@row_elements_array, $cell2_value);
}
else
{
my $blank="";
push(@row_elements_array, $blank);
}
}
my $next_line="\n";
push(@row_elements_array, $next_line);
my @temp_row_elements_array= @row_elements_array;
$csv_1->print($fh, \@temp_row_elements_array);
}
close $fh;
}
return $student_excel_out_csv_file;
}
解决方案
根据我对您的要求的理解,一种解决方案是从 $cell2_value 中删除多余的双引号,然后再将其推入@row_elements_array。例如:
$cell2_value =~ s/"(")*/$1/g;
push(@row_elements_array, $cell2_value);
推荐阅读
- c++ - 基准测试时有没有办法模拟缓存局部性?
- python - 我的数组中只有 1 项被使用(应该全部使用)
- xamarin.forms - Xamarin.Forms 中的列布局
- xml - 使用 xmlstarlet 将 XML 转换为 CSV 没有成功
- python-3.x - 实时更新不同python进程中的DataFrame
- powershell - 从 Powershell 中的文本文件中提取响应的困难
- java - 将日期字符串转换为整数数组
- excel - 如何使用 getElement 检索标题
- python - 按行将 PDF 拆分为图像(OCR 模型训练)
- c - 在 glibc lockf.c 函数中调试 segfault - 如何查看 lockf.c 的源代码