预测Excel如何使用Postgres函数来解释一个string

在我的工作场所,我们有部分编号(项目编号),在Excel中input时常常被转换成Excel 认为用户的含义。

例如,Excel进行这些更改:

00001234 => 1234 005678.0 => 5678 1234.560 => 1234.56 

由于电子表格来自我们控制之外的来源,因此我们无法尝试控制Excel本身的行为。

我有一个实用工具,它使用VSTO(C#)连接到Excel,然后输出到Postgres表,并尝试查找“Excel零件号”并将其转换回实际零件编号。 简而言之,它看起来像这样:

 create table mdm.excel_lookup ( actual_part_number text not null, excel_part_number text not null, lookup_priority integer not null, constraint excel_lookup_pk primary key (actual_part_number) ); 

为了填充这个表格,我写了一个使用plperl的函数,试图获取任何给定的string,并预测Excel如何解决这个问题。 我相信我已经处理了带有前导零的数字,还有在小数点后被切掉的零。

不幸的是这并不包括所有的东西 我不认为date是可以预料的,所以我甚至不会去尝试,除非有人有一个好主意。 但是科学记数法呢? 有没有其他的情况我没有想到?

我们的零件目录有超过150万个零件,所以可能发生的事情有很多种可能性。 如果我能抓住相当比例的话,我会很开心。

到目前为止,这是我的function。 如果有人对我能做些什么来获得Excel可能做的其他事情有所了解,我会欢迎反馈意见。 注意到目前为止,只处理上面列出的场景。

 CREATE OR REPLACE FUNCTION excel_part(part_number text) RETURNS text AS $BODY$ my ($input) = @_; if ($input =~ /[A-Za-z]/) { return $input; } elsif ($input =~ /^0+(\d+)$/) { return $1; } elsif ($input =~ /^(\d+\.\d*)0+$/) { return $1 + 0; } else { return $input; } $BODY$ LANGUAGE plperl VOLATILE COST 100; 

另外,我还没有娶过。 我只用它,因为我知道Perl真的擅长文本处理。

我的build议是将所有零件编号提取到excel中,在完成编号后保存文件,然后将结果作为新表格(或原始表格中的列)上载回数据库。 这样,你不必担心任何你没有处理的情况。 如果您经常在此基础上进行查找并轻松检测任何零件号码,最后在消失后变成重复号码,则还可以对列进行索引。

你必须有一些方法来确定什么,然后重新上传Excel到达他们。 如果有一个代理ID列,你可以使用它,否则做一些简单的事情,比如在零件编号前面加上“Part-”,这样Excel就会看到一个string而不是触摸它。

如果simbabque是正确的,不同的excel版本做不同的事情,你可以通过多个不同版本的excel运行这个过程,并保存独特的军队。

为了回应Tim Tom的回答,这是一个C#程序,实现了他的build议…而且我的工作很棒!

  NpgsqlConnection conn = new NpgsqlConnection(); conn.Open(); Excel.Application xl = new Excel.Application(); xl.Visible = true; Excel.Workbook wb = xl.Workbooks.Add(1); Excel.Worksheet ws = (Excel.Worksheet)wb.Sheets[1]; List<string> parts = new List<string>(); NpgsqlCommand cmd = new NpgsqlCommand("select prod_id from mdm.global_item_master", conn); NpgsqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) parts.Add(reader.GetString(0)); reader.Close(); NpgsqlCopyIn copy = new NpgsqlCopyIn( "copy mdm.excel_item_id from STDIN WITH NULL AS '' CSV;", conn); copy.Start(); NpgsqlCopySerializer cs = new NpgsqlCopySerializer(conn); cs.Delimiter = ","; foreach (string part in parts) { ws.Cells[1, 1].Value2 = part; cs.AddString(part); cs.AddString(ws.Cells[1, 1].Text); cs.EndRow(); } cs.Close(); copy.End(); conn.Close();