我有一个报告文件(.rpt),其文本如下所示,此.rpt文件每天都会更新。
Datum/Uhrzeit,Sta.,Bez.,Unit,TBId,Batch,OrderNr,Mat1,Total1,Mat2,Total2,Mat3,Total3,Mat4,Total4,Mat5,Total5,Mat6,Total6,Summe
41521.755934(04.09.13 18:08:32),TB01,TB01,005,300,9663, ,2,27313.63,0,0.00,0,0.00,3,1776.19,0,0.00,0,0.00,29089.82
41521.797601(04.09.13 19:08:32),TB01,TB01,005,300,9682, ,2,27365.98,0,0.00,0,0.00,3,1780.86,0,0.00,0,0.00,29146.85
41521.839269(04.09.13 20:08:32),TB01,TB01,005,300,9701, ,2,27418.34,0,0.00,0,0.00,3,1785.53,0,0.00,0,0.00,29203.88
41521.880937(04.09.13 21:08:33),TB01,TB01,005,300,9721, ,2,27473.31,0,0.00,0,0.00,3,1790.40,0,0.00,0,0.00,29263.71
41521.922606(04.09.13 22:08:33),TB01,TB01,005,300,9741, ,2,27528.53,0,0.00,0,0.00,3,1795.30,0,0.00,0,0.00,29323.83
41521.964274(04.09.13 23:08:33),TB01,TB01,005,300,9760, ,2,27580.88,0,0.00,0,0.00,3,1799.97,0,0.00,0,0.00,29380.84
41522.005942(05.09.13 00:08:33),TB01,TB01,005,300,9780, ,2,27636.00,0,0.00,0,0.00,3,1804.86,0,0.00,0,0.00,29440.86
需要提取每行的第一个和最后一个读取值,并且需要将该读数放在数据库表中。
首读 - Datum / Uhrzeit
上次阅读 - Summe
我也使用了COPY命令,但它没有取第一个值。我想知道用哪个数据类型来提取这个值(它不是正常的日期格式)???
也是不可能只从这个文件中取出这两个读数而不是整个20个读数?有没有这样的方法?
我正在使用PostgreSQL 9.0
任何帮助都会很棒。
答案 0 :(得分:0)
假设"阅读" ="列":
您需要COPY
到TEMPORARY
表,其中第一列的类型为text
,而不是date
,因为这是无效的日期格式。
然后你可以使用INSERT INTO teal_table (col1, col2, ...) SELECT some_func(thedate), col2, col3... FROM temptable
使用适当的SQL将临时表内容转换为正确的日期数据,并将其插入到真实的目标表中。
Stack Overflow上有很多现有的例子,但不适用于您的特定日期格式。我猜测parens (...)
中的日期是您想要的日期,之前的数字是该日期的表示,即自纪元以来的天数+自一天开始以来的时间。它可以更容易地解析日期部分,您可以使用:
SELECT to_timestamp(substring('41521.880937(04.09.13 21:08:33)' from '\(.*\)' ), '(DD.MM.YY HH24.MI.SS)');
以便为您提供上述some_func
。
至于只选择两个所需的列I already explained that to you before,所以我不会重复自己。简短版本:使用ETL工具,仅使用这些列重新导出CSV,或使用过滤程序限制输入。