You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET读取分号分隔TXT构建数组查找匹配文本异常求助

问题诊断

你现有代码存在几处明确的语法和逻辑错误,直接导致运行异常、查找失败:

  1. DivideTranslSource函数存在基础语法错误:Substring方法第一个参数要求传入整数类型的起始索引,你传入了字符串变量;ReDim Preserve调整数组维度时要求传入整数参数,你传入了字符串变量,这个函数本身无法正常编译运行,可直接弃用。
  2. DivideTranslSource1存在逻辑漏洞:
    • 二维数组维度定义错误:VB.NET数组为0起始索引,你传入列数参数2初始化数组时,实际创建了3列的数组,存在冗余空间;
    • 无容错处理:遇到空行、无分隔符的无效行时,直接按索引取拆分结果会触发索引越界异常;
    • 拆分逻辑错误:直接使用Split方法拆分所有匹配的分隔符,如果翻译文本本身包含分号,会被拆分为多段,导致文本内容丢失。
  3. FindTextTranslation循环边界错误:GetUpperBound(0)获取的是二维数组第一维(列维度)的最大索引,你列数固定为2时该值为1,循环仅会执行1次,无法遍历所有存储的条目。
推荐实现方案

针对键值对查找场景,直接使用Dictionary(Of String, String)存储数据比二维数组更简洁、查找效率更高,无需手动维护数组维度、处理重定义问题,适配你百余条数据的场景完全足够,也方便后续多语言切换。

完整代码

' 全局字典存储ID与对应翻译文本的键值对
Private translationDict As New Dictionary(Of String, String)

''' <summary>
''' 加载指定路径的语言配置文件
''' </summary>
''' <param name="filePath">语言文件完整路径</param>
''' <param name="splitChar">ID与文本的分隔符,默认为分号</param>
Public Sub LoadLanguageFile(filePath As String, Optional splitChar As Char = ";"c)
    translationDict.Clear()
    ' 校验文件是否存在
    If Not IO.File.Exists(filePath) Then
        Throw New IO.FileNotFoundException($"语言文件加载失败:{filePath}")
    End If
    ' 逐行读取文件内容,自动释放文件流
    For Each line As String In IO.File.ReadAllLines(filePath)
        ' 跳过空行
        If String.IsNullOrWhiteSpace(line) Then Continue For
        ' 仅以第一个出现的分隔符拆分,避免文本内部分号被错误分割
        Dim splitPos As Integer = line.IndexOf(splitChar)
        If splitPos < 0 Then Continue For ' 跳过无分隔符的无效行
        Dim textId As String = line.Substring(0, splitPos).Trim()
        Dim textContent As String = line.Substring(splitPos + 1).Trim()
        ' 避免重复ID触发异常
        If Not translationDict.ContainsKey(textId) Then
            translationDict.Add(textId, textContent)
        End If
    Next
End Sub

''' <summary>
''' 根据文本ID查找对应翻译内容
''' </summary>
''' <param name="textId">配置的文本ID</param>
''' <returns>找到返回对应文本,未找到返回空字符串</returns>
Public Function FindTextTranslation(textId As String) As String
    Dim result As String = String.Empty
    If translationDict.TryGetValue(textId, result) Then
        Return result
    End If
    Return String.Empty
End Function

调用方式

程序初始化、切换语言时直接调用加载方法即可,无需手动处理数组逻辑:

' 加载意大利语配置文件
LoadLanguageFile("C:\VisualStudio2019\LangFiles\comments-0.txt")
' 查找指定ID的文本
Dim showText As String = FindTextTranslation("IDelement1")
' 切换英语时直接加载对应文件即可,原有内容会被自动清空
' LoadLanguageFile("C:\VisualStudio2019\LangFiles\comments-1.txt")
注意事项
  • 配置文件建议统一使用UTF-8编码保存,避免读取时出现中文、特殊字符乱码;
  • 如果后续需要给配置文件加注释,可以约定以#开头的行为注释行,在读取时增加判断跳过即可,方便非开发人员修改配置。

内容的提问来源于stack exchange,提问作者ErCapoAlex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:48:26