亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 43192 | 回復(fù): 12
打印 上一主題 下一主題

[文本處理] 如何處理寬度固定的列 [復(fù)制鏈接]

論壇徽章:
2
技術(shù)圖書徽章
日期:2013-12-17 13:52:152015亞冠之薩濟拖拉機
日期:2015-07-19 11:07:52
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2016-07-29 19:42 |只看該作者 |倒序瀏覽
有一個通過sqlplus spool出來的文本文件,列的寬度是固定的,現(xiàn)在要求還原成SQL文本
  1. 12345678 123456 1234 12345678 123456
  2. abcd     abc3        7834     4556  
  3. 34       45     dfd  444            
復(fù)制代碼
以上文件有5列,每列之間用一個空格分開,注意可能有些列的值為空(比如第二行第三列),列的定義如下:

第1列: char 8
第2列: char 6
第3列: char 4
第4列: number 8
第5列: char 6

要求轉(zhuǎn)換成SQL語句,比如第二行轉(zhuǎn)換后為:

insert into t values('abcd','abc3',null,7834,'4556');

論壇徽章:
307
程序設(shè)計版塊每周發(fā)帖之星
日期:2016-04-08 00:41:33操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-09-02 06:20:00每日論壇發(fā)貼之星
日期:2015-09-02 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-04 06:20:00每日論壇發(fā)貼之星
日期:2015-09-04 06:20:00每周論壇發(fā)貼之星
日期:2015-09-06 22:22:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-09 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-19 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-20 06:20:00每日論壇發(fā)貼之星
日期:2015-09-20 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-22 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-24 06:20:00
2 [報告]
發(fā)表于 2016-07-29 19:57 |只看該作者
看著列的對其方式倒是挺齊的, 就是不知道空列如何進(jìn)行判斷.

論壇徽章:
2
技術(shù)圖書徽章
日期:2013-12-17 13:52:152015亞冠之薩濟拖拉機
日期:2015-07-19 11:07:52
3 [報告]
發(fā)表于 2016-07-29 20:45 |只看該作者
二樓的,列都是定長的,不夠?qū)挾鹊亩加每崭裱a齊了,因此只需要按照列寬度從相應(yīng)位置截取,去掉尾部的空格即可。
比如第二行第三列,從第17個char向后截取4位,就代表第三列的值,結(jié)果是4個空格,去掉尾部所有空格,就變成空了。

論壇徽章:
2
技術(shù)圖書徽章
日期:2013-12-17 13:52:152015亞冠之薩濟拖拉機
日期:2015-07-19 11:07:52
4 [報告]
發(fā)表于 2016-07-29 22:27 |只看該作者
加了個班,搞定了
  1. BEGIN{
  2.   FIELDWIDTHS="9 7 5 9 7"
  3. }
  4. {
  5.   for (i=1;i<=NF;i++){
  6.     gsub(/\s*$/,null,$i)
  7.     $i=$i==null?"null":"'"$i"'"
  8.   }
  9.   printf("insert into t values(%s,%s,%s,%s,%s);\n",$1,$2,$3,$4,$5)
  10. }
復(fù)制代碼

論壇徽章:
307
程序設(shè)計版塊每周發(fā)帖之星
日期:2016-04-08 00:41:33操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-09-02 06:20:00每日論壇發(fā)貼之星
日期:2015-09-02 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-04 06:20:00每日論壇發(fā)貼之星
日期:2015-09-04 06:20:00每周論壇發(fā)貼之星
日期:2015-09-06 22:22:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-09 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-19 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-20 06:20:00每日論壇發(fā)貼之星
日期:2015-09-20 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-22 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-24 06:20:00
5 [報告]
發(fā)表于 2016-07-29 22:28 |只看該作者
3 樓的, 試下:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. while (<DATA>){
  5.     my ($last_pos, @aData) = 0;
  6.     foreach my $num ((8, 6, 4, 8, 6)){
  7.         my $val = substr ($_, $last_pos, $num) =~ s/\s+//r;
  8.         push (@aData, length ($val) ? qq ('$val') : 'null');
  9.         $last_pos += $num + 1;
  10.     }
  11.     print "insert into t values(", join (",", @aData), ");\n";
  12. }

  13. __DATA__
  14. 12345678 123456 1234 12345678 123456
  15. abcd     abc3        7834     4556
  16. 34       45     dfd  444
復(fù)制代碼
perl abc.pl
----------------------------------------------------------------
insert into t values('12345678','123456','1234','12345678','123456');
insert into t values('abcd','abc3',null,'7834','4556');
insert into t values('34','45','dfd','444',null);

論壇徽章:
307
程序設(shè)計版塊每周發(fā)帖之星
日期:2016-04-08 00:41:33操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-09-02 06:20:00每日論壇發(fā)貼之星
日期:2015-09-02 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-04 06:20:00每日論壇發(fā)貼之星
日期:2015-09-04 06:20:00每周論壇發(fā)貼之星
日期:2015-09-06 22:22:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-09 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-19 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-20 06:20:00每日論壇發(fā)貼之星
日期:2015-09-20 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-22 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-24 06:20:00
6 [報告]
發(fā)表于 2016-07-29 22:44 |只看該作者
我猜你還得再加加班, 把問題先搞定再說.

論壇徽章:
307
程序設(shè)計版塊每周發(fā)帖之星
日期:2016-04-08 00:41:33操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-09-02 06:20:00每日論壇發(fā)貼之星
日期:2015-09-02 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-04 06:20:00每日論壇發(fā)貼之星
日期:2015-09-04 06:20:00每周論壇發(fā)貼之星
日期:2015-09-06 22:22:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-09 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-19 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-20 06:20:00每日論壇發(fā)貼之星
日期:2015-09-20 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-22 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-24 06:20:00
7 [報告]
發(fā)表于 2016-07-29 22:52 |只看該作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my @aWidth = (8, 6, 4, 8, 6);
  5. while (<DATA>){
  6.     my ($last_pos, @aData) = 0;
  7.     while (my ($idx, $leng) = each @aWidth){
  8.         my $v = substr ($_, $last_pos, $leng) =~ s/\s+//r;
  9.         push (@aData, length ($v) ? do {$idx != 3 ? qq ('$v') : $v} : 'null');
  10.         $last_pos += $leng + 1;
  11.     }
  12.     print "insert into t values(", join (",", @aData), ");\n";
  13. }

  14. __DATA__
  15. 12345678 123456 1234 12345678 123456
  16. abcd     abc3        7834     4556
  17. 34       45     dfd  444
復(fù)制代碼
perl abc.pl
---------------------------------------------------------------------------------------------------------------
insert into t values('12345678','123456','1234',12345678,'123456');
insert into t values('abcd','abc3',null,7834,'4556');
insert into t values('34','45','dfd',444,null);

評分

參與人數(shù) 1信譽積分 +50 收起 理由
rm-rf + 50 很給力!

查看全部評分

論壇徽章:
2
技術(shù)圖書徽章
日期:2013-12-17 13:52:152015亞冠之薩濟拖拉機
日期:2015-07-19 11:07:52
8 [報告]
發(fā)表于 2016-07-29 22:53 |只看該作者
sunzhiguolu 發(fā)表于 2016-07-29 22:44
我猜你還得再加加班, 把問題先搞定再說.


基本上搞定了,number型的還有些缺陷,number類型的insert不能加單引號,我的那個腳本也有一樣的問題。
看來得區(qū)分number和string的。

論壇徽章:
28
15-16賽季CBA聯(lián)賽之八一
日期:2016-02-22 19:10:4215-16賽季CBA聯(lián)賽之深圳
日期:2016-12-01 10:34:0415-16賽季CBA聯(lián)賽之新疆
日期:2016-12-07 10:24:2915-16賽季CBA聯(lián)賽之同曦
日期:2016-12-15 12:06:43CU十四周年紀(jì)念徽章
日期:2016-12-18 13:03:4415-16賽季CBA聯(lián)賽之吉林
日期:2017-01-03 15:52:2515-16賽季CBA聯(lián)賽之遼寧
日期:2017-01-04 14:58:2415-16賽季CBA聯(lián)賽之遼寧
日期:2017-01-15 09:42:512016科比退役紀(jì)念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16賽季CBA聯(lián)賽之上海
日期:2017-03-18 10:14:5415-16賽季CBA聯(lián)賽之青島
日期:2017-03-18 22:00:44
9 [報告]
發(fā)表于 2016-07-29 22:58 |只看該作者
本帖最后由 moperyblue 于 2016-07-29 22:59 編輯

more file
  1. 12345678 123456 1234 12345678 123456
  2. abcd     abc3        7834     4556  
  3. 34       45     dfd  444            
復(fù)制代碼
  1. awk 'BEGIN{
  2.     s="12345678 123456 1234 12345678 123456"
  3.     for(i=1;i<=length(s);i++){
  4.         if(substr(s,i,1)==" ")a[i]
  5.     }
  6. }
  7. NR>1{
  8.     for(i in a){
  9.       $0=gensub(/./,"@",i)
  10.   }
  11.   gsub(/ *@ */,"@")
  12.   gsub(/^ *| *$/,"")
  13.   len=split($0,b,"@")
  14.   for(i=1;i<=len;i++){
  15.     if(b[i]==""){
  16.         b[i]="null"
  17.         }else if(i!=4){
  18.             b[i]="\x27"b[i]"\x27"
  19.         }
  20.     }
  21.     printf "insert into t values("
  22.         for(i=1;i<=len;i++){
  23.             printf  (i==1?"":",")b[i]
  24.         }
  25.         printf ");\n"
  26. }' file
復(fù)制代碼
insert into t values('abcd','abc3',null,7834,'4556');
insert into t values('34','45','dfd',444,null);

論壇徽章:
307
程序設(shè)計版塊每周發(fā)帖之星
日期:2016-04-08 00:41:33操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-09-02 06:20:00每日論壇發(fā)貼之星
日期:2015-09-02 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-04 06:20:00每日論壇發(fā)貼之星
日期:2015-09-04 06:20:00每周論壇發(fā)貼之星
日期:2015-09-06 22:22:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-09 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-19 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-20 06:20:00每日論壇發(fā)貼之星
日期:2015-09-20 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-22 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-24 06:20:00
10 [報告]
發(fā)表于 2016-07-29 23:02 |只看該作者
基本上搞定了,number型的還有些缺陷,number類型的insert不能加單引號,我的那個腳本也有一樣的問題。
看來得區(qū)分number和string的。

還是你老兄會解釋, 還能有基本搞定了這詞兒.
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP