忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 2705 | 回复: 6

数据文本的提取及其他处理问题,谢谢! [复制链接]

论坛徽章:
0
发表于 2018-01-10 20:01 |显示全部楼层
本帖最后由 情节可以很简单 于 2018-01-11 09:23 编辑

我有两个问题:
#-----------------------------------------------第一个问题:
我有一个76行,82列的单字节数据TXT:
mhkdg2456...
k5783gds f...
rdkh3854d...
..................
我想在第一行前面增加一行“,” (或其他字母数字都行)  第一列前面增加一列“,”
#---------------------------------------------------第二个问题:
我的第二个文本类似如下:想提取“X Y BIN”下面的3列数。
name bin 123.34 hua
njbf hg jdh
bhf jk  fdhgk hah
X   Y    BIN
-1  0     5
-2  0     4
-3  0     1
.............
-1  1     3
-2  1     2
-3  1     8

......很长.......
我能够实现提取数据第三列(而且是按xy坐标实现矩阵形式),
但是数据前面的一些单词字符串也都提取出来了,想把它去掉。
处理完变成如下:多余的字符串都在第一行了。
123.34 jdh jhdk BIN 541.............
328..............
456..............
112..............
...................
我的程序:
open A, "567007.txt" or die "Can't open A";                                                         
open B, ">b.txt" or die "Can't open B";                  
while ( <A> ) {                                                                                 
    if( (split)[0] == 45) {print B (split)[2],"\n"} else{print B (split)[2]," "}
}                                                        
close B; close A;


另外我试过"sed -n '57,$p' file;"先提取所要行,然后然后产生中间文件再用上述while循环。
但是我这个Windows系统好像不支持“sed”,一直报错 ...好无力
#--------------------------------



打赏鼓励一下!

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
发表于 2018-01-11 09:32 |显示全部楼层
回复 1# 情节可以很简单

sed 是 Linux/UNIX的命令, Windows默认是不带这个命令的。
虽然可以找到Windows 的版本,但是,使用起来也不是太方便。

楼主能否 把你的问题重新整理一下, 把你的输入  和 你 想要的 结果 都 明确的列出来。
这样,才有方便别人帮你实现。

论坛徽章:
0
发表于 2018-01-11 11:33 |显示全部楼层
本帖最后由 情节可以很简单 于 2018-01-11 14:56 编辑

回复 2# q1208c
您好,感谢回复!我重新整理一下2个问题:两个问题独立
#--------------------------------------第一个问题:
输入文件为如下:共76行,82列
kdg3578...
sd325sg...
dsglw43...
...............
结果输出为:增加第一行和第一列(用“,”表示或任何单字节数字字母)
, , , , , , , ,...
, kdg3578...
, sd325sg...
, dsglw43...
, ...............
#-------------------------------------第二个问题:
输入文件为:
map number 23.45 husd
sgf lkj fbkdj dsgk jld
dghk jdn
dsk ldbgl nlfldj ld
........以上是一段英文说明......
X     Y     P/F         Bin.No   
-3    0   NoTest         3           
-2    0   NoTest         1
-1    0   NoTest         7
.................................
-3    1   NoTest         2           
-2    1   NoTest         6
-1    1   NoTest         4
..................................

输出文件为:按XY坐标输出“Bin.No”数字,前面的英文说明不要。
317......
264......
...........
我现阶段处理的结果在一楼已经说明了。
思路是想先按照行处理:从"-3"行开始输出剩余所有行;
然后再按while循环提取坐标值。现在卡在有效行输出了。






论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2018-01-11 16:08 |显示全部楼层
回复 3# 情节可以很简单

$ perl gen_BIN.pl

$ cat b.txt
317
264

$ cat 567007.txt
map number 23.45 husd
sgf lkj fbkdj dsgk jld
dghk jdn
dsk ldbgl nlfldj ld
........以上是一段英文说明......
X     Y     P/F         Bin.No   
-3    0   NoTest         3           
-2    0   NoTest         1
-1    0   NoTest         7
.................................
-3    1   NoTest         2           
-2    1   NoTest         6
-1    1   NoTest         4
..................................


$ cat gen_BIN.pl

use strict;
use warnings;

my $sFin  = "567007.txt";
my $sFout = "b.txt";

open (FHin,  "<","$sFin")  or die "Can't open $sFin\n";
open (FHout, ">","$sFout") or die "Can't open $sFout\n";

my $n = "";
while (<FHin>) {
  chomp;
  my @aData = split;
  
  #  X     Y     P/F         Bin.No   
  #  -3    0   NoTest         3        
  if (@aData == 4) {
    next if ($aData[0] !~ m/^-/);

    #  -3    0   NoTest         3
    if ($aData[0] == -3) {
      print FHout $n;
      $n="\n";
    }
    # -3    0   NoTest         3
    # -2    0   NoTest         1
    # -1    0   NoTest         7
    print FHout $aData[-1];
  }
}
print FHout "\n";

论坛徽章:
0
发表于 2018-01-15 17:03 |显示全部楼层
本帖最后由 情节可以很简单 于 2018-01-15 17:07 编辑

回复 4# jason680

您好!谢谢回复!我通过您提供的脚本没有实现,我猜测是不是在这句话:因为我X的坐标是从-36~45,所以下面句判断是针对“-”号的,
next if ($aData[0] !~ m/^-/);
我采取了较不灵活的方式:有中间文件。
while ( <A> )
{
   print B unless 1..56;    #先删掉了我不需要的行
}
close B; close A;
open B, "b.txt" or die "Can't open b.txt\n";               
while ( <B> )
{
     if( (split)[0] == 45) {print C (split)[4],"\n"} else{print C (split)[4]," "}
}
close C; close B;

论坛徽章:
0
发表于 2018-01-15 17:14 |显示全部楼层
我提的第二个问题已经在五楼贴出来了,第一个问题后来发现太低级了。。。
但是我也把结果放这吧,有人需要参考也算功德一件了,哈哈文件环境不全,方法较笨,见谅:
open file2, "2.txt" or die "Can't open 2.txt\n";
while (<file2>)
{
   s/a,/a/g;
   s/1,/1/g;  #我需要的一些替换
   print file3 ",$_";   #这个增加了第一行,只有一个逗号。
}
close file2; close file3;
open file3, "3.txt" or die "Can't open 3.txt\n";
my $marker=0;
while (<file3>)
{
        $marker++;
        if($marker==1){
                print file4 ",\n";   #在每一行前加一个逗号
        }
  print file4 $_;   #这样就增加了第一列逗号
}

论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2018-01-15 17:14 |显示全部楼层
回复 5# 情节可以很简单

1. input data
2. rule or procedure
3. output data
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP