要实现一个功能:

从 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方法压根就没读最后一行。查了一下官方文档,找到了答案:

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

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

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

C# StreamReader.ReadLine统计行数的问题的更多相关文章

  1. 《c程序设计语言》读书笔记--统计 行数、单词数、字符数

    #include <stdio.h> int main() { int lin = 0,wor = 0,cha = 0; int flag = 0; int c; while((c = g ...

  2. shell 统计行数

    语法:wc [选项] 文件… 说明:该命令统计给定文件中的字节数.字数.行数.如果没有给出文件名,则从标准输入读取.wc同时也给出所有指定文件的总统计数.字是由空格字符区分开的最大字符串. 该命令各选 ...

  3. linux、WINDOWS命令行下查找和统计行数

    linux : 例子: netstat -an | grep TIME_WAIT | wc -l |  管道符 grep 查找命令 wc 统计命令 windows: 例子: netstat -an | ...

  4. wc 统计行数 字数

    Linux统计文件行数 2011-07-17 17:32 by 依水间, 168255 阅读, 4 评论, 收藏, 编辑 语法:wc [选项] 文件… 说明:该命令统计给定文件中的字节数.字数.行数. ...

  5. SQL Server遍历所有表统计行数

    DECLARE CountTableRecords CURSOR READ_ONLY FOR SELECT sst.name, Schema_name(sst.schema_id) FROM sys. ...

  6. Python,针对指定文件类型,过滤空行和注释,统计行数

    参考网络上代码编辑而成,无技术含量,可自行定制: 目前亲测有效,若有待完善之处,还望指出! 强调:将此统计py脚本放置项目的根目录下执行即可. 1.遍历文件,递归遍历文件夹中的所有 def getFi ...

  7. C++->10.3.2-3,使用文件流类录入数据,并统计行数

    题目:建立一个文本文件,从键盘录入一篇短文存放在该文件中短文由若干行构成,每行不超过80个字符,并统计行数. /* #include<iostream.h>#include<stdl ...

  8. oracle查询表统计行数与注释

    SELECT TABLE_NAME,NUM_ROWS,(select COMMENTS from user_tab_comments WHERE TABLE_NAME=C.TABLE_NAME) FR ...

  9. linux wc 的用法-linux 下统计行数、单词数、字符个数

    linux wc 的用法-linux 下统计行数.单词数.字符个数   wc : wc -l 统计有多少行 wc -w 统计有多少个单词 wc -c 统计有多少个字符

随机推荐

  1. 【Android】jar包Proguard混淆方法

    本文章的前提条件是,读者已经掌握了正确导出jar包的技能. 1.拷贝Android项目中“proguard.cfg”文件到你指定的位置,并改名为“proguard.pro”,此步是为proguardg ...

  2. NOIP2017提高组Day2T3 列队 洛谷P3960 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/9265380.html 题目传送门 - 洛谷P3960 题目传送门 - LOJ#2319 题目传送门 - Vij ...

  3. 046 SparlSQL中的函数

    一:SparkSQL中的函数 1.说明 2.展示所有的函数 qlContext.sql("show functions").show(300) 3.functions类 所有内置支 ...

  4. 20165235 实验一 Java开发环境的熟悉

    20165235 实验一 Java开发环境的熟悉 课程:JAVA程序设计 姓名:祁瑛 学号:20165235 指导老师:娄嘉鹏 实验日期: 2018.4.2 实验内容:java开发环境的熟悉 一,实验 ...

  5. HDU 4553 约会安排 (区间合并)【线段树】

    <题目链接> 寒假来了,又到了小明和女神们约会的季节.  小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有 ...

  6. python & MySQLdb(one)

    python开发过程中用到数据库无外乎MYSQL,Mangodb,redis三种,三者数据库使用可能存在差异,但在一些基础的语句使用时都是大同小异的,这阶段学习了一些基础操作,记录下 add: # - ...

  7. Xamarin Essentials教程语音播报TextToSpeech

    Xamarin Essentials教程语音播报TextToSpeech   语音播报是一种将文本信息转化为音频信息的技术.使用该技术,开发者可以让用户不用盯着屏幕,就可以获取到信息.例如,支付宝为商 ...

  8. opencv3 学习笔记(二)

    1.OpenCv 颜色追踪 import cv2import numpy as npcap=cv2.VideoCapture(0)cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1 ...

  9. Cisco 12系列 AP 初始化配置-1-安装IOS

    12系列AP虽然已经淘汰了,但是像我们这种没钱的公司用了10年却还是在用,好在它还有学习的价值,还是可以从12系列AP看出一些思科部署无线的思路吧. 首先吐槽一下国内常说的胖.瘦AP的这种说法,因为用 ...

  10. CSS选择器、样式、盒模型

    一.CSS基础选择器 # 1.*(通配选择器):html,body以及body下用于显示的标签 #html和body颜色会被改变,但是div标签不会发生改变,由于不同的选择器具有优先级 # 语法:* ...