zoukankan      html  css  js  c++  java
  • C# StreamReader.ReadLine统计行数的问题

    要实现一个功能:

    从 lua 文件中提取字符串放到 excel 中,再将 excel 给海外同事,翻译完成后,用翻译的文本替换相应中文。

    整个功能并不复杂,要点有二点:

    1、提取字符串,一行中文如“我是中文…”,中间可能会遇到”我是中文”xx”我是中文”,如果用正则”[^”]+”则会匹配失败,思路就是先将”替换,查找成功后再将其替换回来,excel中有三列,分别是:key、中文、待翻译文本。

    2、替换 lua 文件中的中文,先将 excel 读出来放到 Dictionary<string, string[]>对象中,然后逐行读取 lua 文件,拿到 key、中文,再从 Dictionary 中查找,满足条件后则进行替换。

    以繁体为例

    为了防止出现:新增了一个 key,或者某个 key 对应的中文有修改,所以在替换的时候有严格的检查。必须该行的 key、value,都存在于 excel 中,才替换相应的内容(仅一次)。

    str9999="我是中文"--[["我是中文"]]

    用string.Replace操作时,上面“我是中文”全部都被替换,不是所期望的。假设韩文或者越南文,我们肯定希望知道这个字符串所表示的含义,故特地将中文保留下来。new Regex().Replace 方法处理字符串嵌套比较麻烦,最后改为 string.Remove().Insert() 来处理。

    讲到这里,基本都是在讲该功能的一些实现细节。在替换我提交SVN的时候,我就发现,明明该lua文件有3405行,但只显示3404行,最后一行是换行符,被干掉了。然后我查代码,发现没问题,被狗吃了?

    如果最后一行改为字符串,如a,行数显示正常。

    如果我额外加5行,显示结果是3409,说明加的5行都识别了,并没有对我添加的换行有特殊处理。

    但最后一行换行就是不被读取。所以,我怀疑ReadLine方法压根就没读最后一行。查了一下官方文档,找到了答案:

    将行定义为后面的字符后跟一条线序列︰ 换行符 (" ")、 回车符 (" ") 或回车符后跟一条线换行符 (" ")。 返回的字符串不包含终止回车或换行。 返回的值是 null 如果到达了输入流的末尾。

    所谓“终止”回车或换行,指的就是上面遇到的,文件最后一行是如果是换行回车,它不会读取最后一行。

    如果使用ReadLine对文件进行行数统计,需要注意最后一个终止回车/换行并不会被读取,不然得到的行数永远会少1

  • 相关阅读:
    docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled (Client.Timeout exceeded while awaiting headers).
    docker load error: open /var/lib/docker/tmp/docker-import-347673752/bin/json: no such file or directory
    redis设置允许远程连接
    redis 连接字符串,设置密码
    abp + angular 项目 图标字体注意事项
    abp + angular 前端使用 hash ,登录界面不跳转问题
    abp 后台项目在IIS 中运行
    cmder 常用快捷键
    CentOS7安装RabbitMQ
    linux 检测服务器端口工具
  • 原文地址:https://www.cnblogs.com/meteoric_cry/p/8426625.html
Copyright © 2011-2022 走看看