vb.net - 比较文件然后用新文件覆盖原始文件
问题描述
我正在寻找一个 vb 代码来执行以下操作:
- 比较文件 A和文件 B
文件 A(位于驱动器 L:\source 中的源)包含以下内容:
AAA
BBB
CCC
DDD
1A1B
文件 B(位于本地驱动器 D:\user 中的用户)包含以下内容:
aaa
bbb
ccc
111
222
333
- 用文件 B (源)覆盖文件 A(用户),使文件 A(最终用户文件)如下所示:
AAA
BBB
CCC
DDD
1A1B
111
222
333
笔记:
源文件 A:
AAA
与文件 B 中的行相同aaa
。
BBB
与文件 B 中的行相同bbb
。
CCC
与文件 B 中的行相同ccc
。
DDD
文件 B 中不存在。
1A1B
文件 B 中不存在。
用户文件 B:
aaa
与 File A 是同一行AAA
,小写用于将其与源文件区分开来。
bbb
与 File A 是同一行BBB
,小写用于将其与源文件区分开来。
ccc
与 File A 是同一行CCC
,小写用于将其与源文件区分开来。
111
是用户线
222
是用户线
333
是用户线
解决方案
由于您没有发布任何代码,我不会从头开始编写整个内容,但如果您在实际代码中遇到问题,我很乐意分享和解释我的方法和帮助。
步骤1
我将创建 4 个列表(集合):
- 文件 A 中的每个原始字符串值 1:CollectionA
- 文件 B 中的每个原始字符串值 1:CollectionB
.ToLower
文件 A 中每个字符串的每个值 1 : CollectionALowers- 1 为您的输出值:CollectionOutput
例子:Dim CollectionA As List(Of String)
第2步
读取文件 A 的每一行,但是当你处理每一行时,你会用它做 3 件事:
- 将值复制到 CollectionA
- 将值复制到 CollectionOutput
- 将值的版本复制
.ToLower
到 CollectionALowers
第 3 步
将文件 B 的每一行读入 CollectionB。
第4步
使用 for-each 循环检查集合 B 中的每个值,以通过检查集合的 .IndexOf 方法来查看其是否在 CollectionA 中,除非在进行检查时,您将获取.ToLower
B 项并在 ToLower 中检查其索引值A 收藏的版本。如果它的索引 > -1 意味着它已经存在所以你不需要将它添加到输出集合中,但是如果索引是 -1 那么它不在 A 的小写集合中所以你添加原始的(非ToLower) 版本的 B 字符串到输出集合。
For Each item as String in CollectionB
if CollectionALowers.IndexOf(item.tolower) = -1 Then
CollectionOutput.Add(item)
end if
Next
第 5 步
将 CollectionOutput 的内容写回文件 A,覆盖原始文件内容。
想法
说了以上所有内容,我不确定您是否真的需要单独的 CollectionOutput。相反,您可以将该项目添加到 CollectionA。仅从资源的角度来看,这将使用更少的内存并且更有效。但是,我发现我自己的程序会随着时间的推移而增长并变得更加复杂,并且随着程序的发展,将事物保存在截然不同的存储桶中通常会派上用场。
试一试,一旦你有一些代码要分享,如果你需要帮助,请发布它。
推荐阅读
- r - 您可以使用劳工统计局 API 将超过 10 年的数据导入 R 吗?
- kotlin - 在 Kotlin 中编写附加访问者函数
- sql - SQL QUERY HELP — 计算给定输入值的关联值的频率
- swift - UITextView 在 SwiftUI 中可表示不尊重 ScrollView 中的宽度界限
- functional-programming - 为什么我的类型不起作用?(使用类型 'a pred = 'a -> bool)
- python - 像 python 脚本这样的谜不会返回任何东西
- php - 如何使用 PHP 抓取维基百科表格?
- node.js - Mongodb/Mongoose bulkwrite(upsert) 性能问题
- python - 如何在折线图中添加相关系数(R^2)?
- python - 优化电影条码