找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 40853|回复: 16

[问题求助] 【已解决】VBS:若读入数据产生首尾颠倒的改变,VBS代码如何进行相应修改

[复制链接]
发表于 2023-3-1 12:27:02 | 显示全部楼层 |阅读模式
本帖最后由 思想之翼 于 2023-3-2 21:43 编辑

原题:http://www.bathome.net/viewthread.php?tid=23404&highlight=
问题:
下列VBS代码读入a.txt的数据,由于记录方式变更,产生首尾颠倒的变化,欲得到相同的运算结果,VBS代码该如何相应修改?恳望得到指点。
示例:
【a.txt 原始记录的数据】
9
0
X
Y
Z
9
0
【a.txt 首尾颠倒后的数据】
0
9
Z
Y
X
0
9
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. set file = fso.OpenTextFile("a.txt")

  3. Do Until file.AtEndOfStream
  4.    strLine = file.ReadLine
  5.    If strLine <> "" Then
  6.       ReDim PreServe ar(n)
  7.       strIn = strIn & "$" & strLine & " "
  8.       ar(n) = strIn : n = n + 1
  9.    End If
  10. Loop

  11. For i = CLng(UBound(ar)/2) to 0 step -1
  12.    ar1 = Split(strIn,ar(i))
  13.    If UBound(ar1) > 1 Then
  14.       For j = 1 to UBound(ar1) - 1
  15.          WriteToFile Split(ar1(j)),Split(ar(i))
  16.       Next
  17.       Exit For
  18.    End If
  19. Next

  20. MsgBox "OK"

  21. Sub WriteToFile(ar2,ar3)
  22.    If UBound(ar2) >= 1 Then
  23.       strOut = Mid(ar2(UBound(ar2)-1),2)
  24.    Else
  25.       strOut = Mid(ar3(UBound(ar3)-1),2)
  26.    End If
  27.    fso.OpenTextFile("b.txt",8,True).WriteLine strOut
  28. End Sub
复制代码

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2023-3-1 17:25:52 | 显示全部楼层
本帖最后由 jyswjjgdwtdtj 于 2023-3-2 21:59 编辑

哦 所以你的意思就是把行给颠倒了,而不是把每个字符颠倒啊
 楼主| 发表于 2023-3-1 17:57:51 | 显示全部楼层
回复 2# jyswjjgdwtdtj
感谢!没能解决问题
发表于 2023-3-1 19:04:30 | 显示全部楼层
回复 3# 思想之翼


    那你想要啥呢?
那你读出来,颠倒,再放到其他的一个txt里
在读取行不?
 楼主| 发表于 2023-3-1 19:14:28 | 显示全部楼层
本帖最后由 思想之翼 于 2023-3-2 10:39 编辑

回复 4# jyswjjgdwtdtj
理解您的想法。文本个数多,折腾数据费时。
发表于 2023-3-1 19:38:31 | 显示全部楼层
这语言描述,ChapGPT也未必能解读
发表于 2023-3-1 20:56:17 | 显示全部楼层
回复 5# 思想之翼


    不是,那你用xml格式啊?
就算是xml也是吧文档放在内存里解析的
你用文本文档,怎么可能有在磁盘里就能从后往前读的?
发表于 2023-3-1 21:01:42 | 显示全部楼层
回复 7# jyswjjgdwtdtj


    获取文件大小,类似 seek 操作直接定位到末尾,offset递减 倒着读咯。如果只是 ASCII 范围内的字符,就不用考虑编码问题。
发表于 2023-3-1 21:44:36 | 显示全部楼层
本帖最后由 jyswjjgdwtdtj 于 2023-3-2 21:57 编辑

回复 8# 523066680


    啊 那就
  1. 'f是打开的文本
  2. a=len(f.readall)
  3. f.skip(a-1)
  4. msgbox f.read(1)
复制代码
你是不是这个意思?有些好奇为啥要从后往前读
发表于 2023-3-1 21:50:50 | 显示全部楼层
回复  523066680


    啊 那就你是不是这个意思?有意思吗
jyswjjgdwtdtj 发表于 2023-3-1 21:44



    咋滴,这口气,要战吗?
发表于 2023-3-1 23:26:11 | 显示全部楼层
回复 9# jyswjjgdwtdtj
    年轻人C语言没接触过吗
本以为吕布已经天下无敌了,没想到有人比他还要勇猛,这是谁的部将?


      include <stdio.h>

      include <stdlib.h>

      int main(int argc, char *argv[] )
      {
          FILE *fp = fopen("tmp.txt", "rb");
          char c;
          int size;
          int offset = -1;

          //定位到文件末尾
          fseek( fp, 0, SEEK_END );
         
          //末尾的offset
          size = ftell(fp);

          int count = 0;
          //只捕获除换行符以外的倒数3个字符
          while ( count < 3 && abs(offset) <= size )
          {
              fseek( fp, offset--, SEEK_END );
              c = getc( fp );  
              if ( c != 13 && c != 10 )
              {
                  count++;
                  printf("%c\n", c);
              }
          }
          return 0;
      }

评分

参与人数 1PB +1 收起 理由
老刘1号 + 1 还专门写一个,讲究

查看全部评分

发表于 2023-3-1 23:48:38 | 显示全部楼层
@老刘1号    1号你好,我是洞洞拐
发表于 2023-3-2 09:10:19 | 显示全部楼层
回复 2# jyswjjgdwtdtj


仔细阅读才能理解楼主的需求:
http://bbs.bathome.net/thread-23404-1-1.html
哪怕错误一个字都可能无法解决真实的问题。
发表于 2023-3-2 20:44:49 | 显示全部楼层
本帖最后由 czjt1234 于 2023-3-2 20:46 编辑
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. set file = fso.OpenTextFile("a.txt")

  3. Do Until file.AtEndOfStream
  4.    strLine = file.ReadLine
  5.    If strLine <> "" Then
  6.       ReDim PreServe br(n)
  7.       strIn = strIn & "$" & strLine & " "
  8.       br(n) = strIn
  9.       n = n + 1
  10.    End If
  11. Loop

  12. n = n - 1
  13. cr = Split(strIn)
  14. strIn = ""
  15. ReDim ar(n)
  16. For i = 0 To n
  17.     j = cr(n - i)
  18.     strIn = strIn & j & " "
  19.     ar(i) = strIn
  20. Next

  21. For i = CLng(UBound(ar) / 2) to 0 step -1
  22.    ar1 = Split(strIn, ar(i))
  23.    If UBound(ar1) > 1 Then
  24.       For j = 1 to UBound(ar1) - 1
  25.          WriteToFile Split(ar1(j)), Split(ar(i))
  26.       Next
  27.       Exit For
  28.    End If
  29. Next

  30. MsgBox "OK"

  31. Sub WriteToFile(ar2, ar3)
  32.    If UBound(ar2) >= 1 Then
  33.       strOut = Mid(ar2(UBound(ar2) - 1), 2)
  34.    Else
  35.       strOut = Mid(ar3(UBound(ar3) - 1), 2)
  36.    End If
  37.    fso.OpenTextFile("b.txt",8,True).WriteLine strOut
  38. End Sub
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢

查看全部评分

 楼主| 发表于 2023-3-13 15:00:04 | 显示全部楼层
本帖最后由 思想之翼 于 2023-3-13 16:53 编辑

回复 14# czjt1234
非常感谢!代码运行结果正确。
VBScript 代码运行速度上不去,转换为 Javascript 或其他脚本语言,是否明显加速?恳望指点!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 01:46 , Processed in 0.024889 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表