如何将拒绝的行重定向到另一个文件?

2023-12-06

这是我的来源csv file

col1,col2,col3,col4,col5,col6
1,A,AA,X,Y,H
2,B,,,CC,D, -- reject this row because (CC)it should be in col3
3,E,FF,Y,L
4,G,,,XX,P,B -- reject this row because(XX) it should be in col3
5,P,Kk,,,D,M -- this is correct record since kk 2 letter digit is in col3
6,G,MM,,,,-- correct record since record MM is in col3 

如何验证此 csv 文件?

这样我就能得到所有2信中column 3 [col3]

我按照这些步骤将源文件复制到另一个文件中(因为我不在源文件中进行操作),然后

我不知道如何将被拒绝的行放入另一个文件中,请有人帮助我!

Sub test()

    '///OPEN FILE and READ
    Set objFileToRead = CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\coe.txt", 1)
    'Set objFileToWrite = CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\copyme2.txt", 2)
    strFileText = objFileToRead.ReadAll()
    objFileToRead.Close


    ' ///PASTE
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFileToWrite = objFSO.OpenTextFile("c:\cou.txt", 2)
    objFileToWrite.Write strFileText
    objFileToWrite.Close

End Sub

如果您是 VBScript 新手,您应该从一个计划(主任务、子任务、解决每个任务的想法)和一个框架 .vbs 开始编码,这样可以轻松地尝试用于解决(子任务)的方法。 )任务。

在您的情况下,主要任务是“将源文件中的坏行过滤到目标文件”。如果您可以“读取源文件的行”、“识别出错误的行”并“将它们写入目标文件”,则此任务就可以解决。

读取文件行的​​默认方法是:

  Dim tsIn : Set tsIn = goFS.OpenTextFile("..\data\21755767.csv")
  Do Until tsIn.AtEndOfStream
     Dim sLine : sLine = tsIn.ReadLine()
  Loop
  tsIn.Close

“默认”的意思是:你必须有很好/具体的理由not选择这个习惯用法(例如:在短文件上使用 .ReadAll() 进行就地编辑或调试显示)或偏离它(例如:如果您的文件是 UTF,则不能依赖 .OpenTextFile 的默认参数-16 编码)。对于某些暴行 - 例如

  Do While Not tsIn.AtEndOfStream = "False"

没有任何借口。

将(某些)行写入另一个文件应该如下所示:

  Dim tsOut : Set tsOut = goFS.CreateTextFile("..\data\21755767-bads.csv")
  Dim tsIn  : Set tsIn  = goFS.OpenTextFile("..\data\21755767.csv")
  Do Until tsIn.AtEndOfStream
     Dim sLine : sLine = tsIn.ReadLine()
     If True Then
        tsOut.WriteLine sLine
     End If
  Loop
  tsIn.Close
  tsOut.Close

使用 .CreateTextFile(JustTheFileSpec) 而不是 .OpenTextFile(lots, of, other, args) 是标准情况下最简单/清晰/错误保存的方法:每次运行脚本的新(可能是空)目标文件。

如上所述,附加一个

  WScript.Echo  goFS.OpenTextFile("..\data\21755767-bads.csv").ReadAll()

显示没问题。

过滤器子任务的想法基于观察:

  1. 标题行包含正确数量的字段/逗号
  2. 有问题的行包含大量逗号

然后很容易将上述工作的结果合并为:

  Dim tsOut   : Set tsOut = goFS.CreateTextFile("..\data\21755767-bads.csv")
  Dim tsIn    : Set tsIn  = goFS.OpenTextFile("..\data\21755767.csv")
  Dim sLine   : sLine     = tsIn.ReadLine()
  Dim nUBSeps : nUBSeps   = UBound(Split(sLine, ","))
  Do Until tsIn.AtEndOfStream
     sLine = tsIn.ReadLine()
     If nUBSeps <> UBound(Split(sLine, ",")) Then
        tsOut.WriteLine sLine
     End If
  Loop
  tsIn.Close
  tsOut.Close

完整脚本:

Option Explicit ' (1)

Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject") ' (2)

WScript.Quit demoReadFile() ' (3)
WScript.Quit demoReadWriteFile()
WScript.Quit demoFilterBads()

Function demoReadFile() ' (4)
  demoReadFile = 0
  Dim tsIn : Set tsIn = goFS.OpenTextFile("..\data\21755767.csv")
  Do Until tsIn.AtEndOfStream
     Dim sLine : sLine = tsIn.ReadLine()
     WScript.Echo tsIn.Line - 1, sLine
  Loop
  tsIn.Close
End Function

Function demoReadWriteFile() ' (5)
  demoReadWriteFile = 0
  Dim tsOut : Set tsOut = goFS.CreateTextFile("..\data\21755767-bads.csv")
  Dim tsIn  : Set tsIn  = goFS.OpenTextFile("..\data\21755767.csv")
  Do Until tsIn.AtEndOfStream
     Dim sLine : sLine = tsIn.ReadLine()
     If True Then
        tsOut.WriteLine sLine
     End If
  Loop
  tsIn.Close
  tsOut.Close
  WScript.Echo  goFS.OpenTextFile("..\data\21755767-bads.csv").ReadAll()
End Function

Function demoFilterBads() ' (6)
  demoFilterBads = 0
  Dim tsOut   : Set tsOut = goFS.CreateTextFile("..\data\21755767-bads.csv")
  Dim tsIn    : Set tsIn  = goFS.OpenTextFile("..\data\21755767.csv")
  Dim sLine   : sLine     = tsIn.ReadLine()
  Dim nUBSeps : nUBSeps   = UBound(Split(sLine, ","))
  Do Until tsIn.AtEndOfStream
     sLine = tsIn.ReadLine()
     If nUBSeps <> UBound(Split(sLine, ",")) Then
        tsOut.WriteLine sLine
     End If
  Loop
  tsIn.Close
  tsOut.Close
  WScript.Echo  goFS.OpenTextFile("..\data\21755767-bads.csv").ReadAll()
End Function

示例输出:

演示ReadFile()

cscript 21755767.vbs
1 col1,col2,col3,col4,col5
2 1,A,AA,X,Y
3 2,B,,,CC,D
4 3,E,FF,Y,
5 4,G,,,XX,P

demoFilterBads()

cscript 21755767.vbs
2,B,,,CC,D
4,G,,,XX,P

这样的脚本可以从骨架/模板开始,例如:

Option Explicit ' (1)

Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject") ' (2)

WScript.Quit step00() ' (3)
WScript.Quit step01()

...

Function step00() ' (4)
  step00 = 0
  ...
End Function
  1. 所有脚本都应以“Option Explicit”开头,以防止变量名称拼写错误
  2. 如果您允许全局变量,那么 goFS 是一个不错的选择。如果没有,则仅创建一个 FSO 并将其传递给需要它的子/函数/方法。Never每次需要它的方法/属性时创建一个新的 FSO。
  3. 使用注释或重新排序来调用您当前使用的函数
  4. “样本”功能;写很多来检查/阐述你的想法

更新评论:

添加实用函数:

Function qq(s) : qq = """" & s & """" : End Function

和一个实验/探索功能:

Function demoFilterSteps()
  demoFilterSteps = 0
  Dim sLine
  For Each sLine In Split("col1,col2,col3,col4,col5 1,A,AA,X,Y 2,B,,,CC,D")
      WScript.Echo 0, qq(sLine)
      Dim aParts  : aParts  = Split(sLine, ",")
      Dim nUBSeps : nUBSeps = UBound(aParts)
      WScript.Echo 1, nUBSeps, qq(Join(aParts, "-"))

      WScript.Echo
  Next
  nUBSeps = 4            ' correct
  sLine   = "2,B,,,CC,D" ' bad
  Dim sExpr : sExpr = "nUBSeps <> UBound(Split(sLine, "",""))"
  WScript.Echo 2, nUBSeps, qq(sLine), sExpr, CStr(Eval(sExpr))
End Function

output:

cscript 21755767.vbs
0 "col1,col2,col3,col4,col5"
1 4 "col1-col2-col3-col4-col5"

0 "1,A,AA,X,Y"
1 4 "1-A-AA-X-Y"

0 "2,B,,,CC,D"
1 5 "2-B---CC-D"

2 4 "2,B,,,CC,D" nUBSeps <> UBound(Split(sLine, ",")) True

To see

  1. 拆分标题行会导致 nUBSeps 为 4(5 个字段之间有 4 个分隔符)
  2. 一条好的线路也会导致 nUBSeps 为 4 - 这并不奇怪
  3. 坏线的 nUBSeps 不同 () 为 4;本样本中有 5 个
  4. 假设 nUBSeps 为 4(正确),则表达式nUBSeps <> UBound(Split(sLine, ","))当 sLine 持有坏行时,计算结果为 True - 因此该行应写入目标文件
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将拒绝的行重定向到另一个文件? 的相关文章

随机推荐

  • 方法与类型中的另一个方法具有相同的擦除

    为什么在同一个类中存在以下两个方法是不合法的 class Test void add Set
  • SSIS - 轮询文件文件夹和触发 ETL 包

    需要建议 请参阅下面的场景 我们开发了1个ETL包 可以一次处理5个文件 通常需要1分钟 我们预计早上 也就是说早上 6 点到 7 点之间 可以有近 100 个以上的文件进入 PROCESSING 文件夹 我正在努力设计 开发某种轮询机制
  • 按下后退按钮时如何清除 Fragment 上的 ListView?

    所有数据均来自该ListView由一个提供CursorAdapter 每当我按下后退按钮并return活动 然后单击该活动以开始我的活动fragment 所有以前的数据仍然相互堆叠 1 创建接口BackPressedListener pub
  • Python:为什么不同的线程从一个生成器获取自己的一系列值?

    我正在学习Python 中的多线程 我想知道如何使用生成器向多个线程提供数据 这是我写的 import threading data i for i in xrange 100 def generator for i in data yie
  • 如何生成仅包含 1 和 0 的 14x10 矩阵的所有可能组合

    我正在解决一个问题 一个解决方案需要输入每个可能由 1 和 0 组成的 14x10 矩阵 我如何生成这些矩阵 以便我可以将每个可能的 14x10 矩阵输入到另一个函数中 谢谢你 3 月 21 日添加 看来我的帖子措辞不恰当 对不起 我想做的
  • MATLAB:复制数组的特定部分

    我试图从矩阵中复制一些元素 但不是整行 也不是单个元素 例如 在以下矩阵中 a 1 2 3 4 5 6 7 8 9 0 我如何复制以下数据 b 1 3 5 即仅第 1 列中的第 1 3 行 我知道您可以像这样删除整个列 b a 1 我很欣赏
  • 如何解密或访问受保护的 Access 数据库?

    我接手了一个旧的软件项目 它使用 MS Access 数据库来存储数据 但是数据库不会在 Access 中打开 如下所示 您没有使用 database mdb 对象所需的权限 请让您的系统管理员或创建此对象的人员为您建立适当的权限 但我不知
  • 步骤定义检测仅在项目配置为 Cucumber 项目时有效。- 虚拟机

    无法连接功能文件和步骤定义文件 仅在 Win Server 2012R2 虚拟机中安装的 eclipse 中才会发生 当您从 git 或直接从本地系统导入任何新的 Cucumber 项目时 将会出现此错误 因为你还没有将项目配置为cucum
  • Cassandra 3 Java 驱动程序构建动态查询

    有没有办法通过给定参数构建动态查询 public List getData String title Date dateFrom Statement statement QueryBuilder select all from test d
  • SVN:我的存储库访问时出现 500 内部服务器错误

    操作系统是Ubuntu服务器 我使用 SVN 创建一个新的存储库 如下所示 svnadmin create myrepo pre 1 6 compatible 第一次 当我想访问我的新存储库时myrepo 使用TortoiseSVN工具 我
  • 减去两个字符

    我刚刚开始汇编编程 所以我是一个初学者 为了练习 我尝试用汇编语言重写基本的 libc NASM Intel 语法 但我被困在strcmp功能 Compare two C style NUL terminated strings Input
  • 如何在 iPhone 中使用 nsdocuments 目录进行下载

    我有一个带有下载选项的iPhone应用程序 并且我使用nsdocument目录路径进行下载 但是下载后我如何才能访问iPhone中的文档路径 我需要安装任何其他应用程序来访问文件吗 如果是 请告诉我该应用程序 谢谢 NSDownloadsD
  • 将原始电子邮件(带附件)发送给多个收件人

    我目前正在使用 Python 2 7 并尝试使用 Boto SES 将带有附件 确切地说是 CSV 的原始电子邮件发送到多个地址 我可以发送普通电子邮件send email 但是当我尝试通过以下方式发送给多个人时 我不断收到错误消息send
  • 找出一个点属于哪个四面体元素

    我有一个 3d 区域的四面体网格 网格由扩展名为 node 和 ele 的两个文件定义 其中包含与节点和元素相关的数据 这是 tetgen 3d Delaunay 四面体化程序 的输出文件的格式 node 文件的每一行包含节点编号以及该节点
  • 使用“imager”包中的 load.image() 函数在 R 中加载多个图像

    我想使用 imager 包中提供的 load image 函数加载多个图像 但我收到一条错误消息 找不到文件 有人可以帮我解决这个问题吗 我尝试加载列表中的图像 并将此列表作为参数添加到 load image 函数中 但它只能读取一个文件
  • Python/html- 将多个 html 合并为一个 [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我写了一个 python 脚本来将文本文件转换为 html 文件 但如果我不能把它们全部
  • 当没有给出路径时,在java中将在哪里创建一个新文件?

    在Java中 File f f new File myfile txt if f exists f createNewFile 执行上述代码时 默认分配的是哪个路径 而没有给出具体路径 当前目录 您可以通过调用以下命令获取 new File
  • 如何使用 VLC 流式传输图像/文件?

    所以我知道有很多 libVLC dll 的包装器 但我只是不知道谁准备好做我需要做的事情 我需要的很简单 在我的 C 程序中 我创建了一些位图 每秒一次或两次 我现在想使用 VLC 将位图作为视频 以 VLC 可以提供的某种格式 实时流式传
  • 在 malloc 内存上使用 sizeof() [重复]

    这个问题在这里已经有答案了 可能的重复 新手关于malloc和sizeof的问题 我正在尝试将字符串读入程序中 当我注意到字符串有时会被损坏时 我尝试了以下代码 void mallocated malloc 100 printf sizeo
  • 如何将拒绝的行重定向到另一个文件?

    这是我的来源csv file col1 col2 col3 col4 col5 col6 1 A AA X Y H 2 B CC D reject this row because CC it should be in col3 3 E F