Project1

标题: 关于读取txt的问题...... [打印本页]

作者: 喵呜喵5    时间: 2014-4-13 18:56
标题: 关于读取txt的问题......
本帖最后由 喵呜喵5 于 2014-4-17 12:40 编辑

我使用这样一个方法读取文本文件
  1. def read_txt
  2.   File.open("Text.txt", "r") do |file|   
  3.     file.readlines.each do |contents|
  4.       text = contents.chop
  5.       p text
  6.     end
  7.   end
  8. end
复制代码
但是我发现读取的文本中第一行会多出一个空格
求教出现这种情况的原因以及解决方法
作者: test    时间: 2014-4-13 19:44
本帖最后由 test 于 2014-4-13 19:46 编辑
  1. def read_txt
  2.   File.open("Text.txt", "r") do |file|   
  3.     file.readlines.each do |contents|
  4.       text = contents.chop.gsub("\xEF\xBB\xBF", "")
  5.       p text
  6.     end
  7.   end
  8. end
复制代码
我想改成这样子应该就没有问题了……
作者: 喵呜喵5    时间: 2014-4-13 20:43
test 发表于 2014-4-13 19:44
我想改成这样子应该就没有问题了……

谢谢,顺便问一下字符串有没有比较方便的删除某个位置字符的方法
作者: taroxd    时间: 2014-4-13 21:10
本帖最后由 taroxd 于 2014-4-13 21:21 编辑
喵呜喵5 发表于 2014-4-13 20:43
谢谢,顺便问一下字符串有没有比较方便的删除某个位置字符的方法


比如 slice! 之类的?
RUBY 代码复制
  1. =begin
  2. slice!(fixnum) → fixnum or nil
  3. slice!(fixnum, fixnum) → new_str or nil
  4. slice!(range) → new_str or nil
  5. slice!(regexp) → new_str or nil
  6. slice!(other_str) → new_str or nil
  7. Deletes the specified portion from str, and returns the portion deleted.
  8. =end
  9.  
  10. string = "this is a string"
  11. string.slice!(2)        #=> "i"
  12. string.slice!(3..6)     #=> " is "
  13. string.slice!(/s.*t/)   #=> "sa st"
  14. string.slice!("r")      #=> "r"
  15. string                  #=> "thing"


然后顶楼问题我没有重现,不知道是什么情况。我一般是这么写的
RUBY 代码复制
  1. IO.foreach('test.txt') do |line|
  2.   p line.chomp
  3. end

作者: test    时间: 2014-4-13 22:32
喵呜喵5 发表于 2014-4-13 20:43
谢谢,顺便问一下字符串有没有比较方便的删除某个位置字符的方法

好象没有,不过可以自己写一个函数。
可以参考我写的这个函数:
参数分别是:字符串、开始的位置、删除的字符数
  1. def str_del(str, start, len)
  2.     sl = str.to_s.length
  3.     start = (start > sl) ? sl : start
  4.     len = (start + len > sl) ? (sl - start) : len
  5.     return str[0...start] + str[start + len...sl]
  6. end

  7. text = "abcdefg"
  8. new_text = str_del(text, 1, 3)
  9. msgbox(new_text) # => "aefg"
复制代码

作者: oOxinlan    时间: 2014-4-13 23:55
test 发表于 2014-4-13 19:44
我想改成这样子应该就没有问题了……

我新建了个“测试.txt”,复制了上面的代码,修改成File.open(“测试.txt”,"r")运行的时候提示找不到文件,请问,新建的txt要保存在哪里他才能找到
作者: taroxd    时间: 2014-4-14 16:24
本帖最后由 taroxd 于 2014-4-14 17:22 编辑

To 4L评分
  1. #encoding: utf-8

  2. IO.foreach('utf8.txt', encoding: 'utf-8') do |line|
  3.   puts line.chomp
  4. end
复制代码
Output:这是一个utf8文件

这样或许还能解决楼主顶楼那个多空格的问题,不过我这里从来没有这个问题所以不敢保证。
然后因为ASCII和UTF8是兼容的,所以把ASCII直接当做UTF8读取应该没什么问题吧…… 这样就自动把ASCII转成UTF8了。
作者: 喵呜喵5    时间: 2014-4-14 18:43
taroxd 发表于 2014-4-14 16:24
To 4L评分Output:这是一个utf8文件

这样或许还能解决楼主顶楼那个多空格的问题,不过我这里从来没有这个 ...

我这边读取ASCII编码的中文字符时会报错,UTF8的话出现多出来的空格貌似是因为UTF8开头有三个表明编码的字符
作者: taroxd    时间: 2014-4-14 20:04
喵呜喵5 发表于 2014-4-14 18:43
我这边读取ASCII编码的中文字符时会报错,UTF8的话出现多出来的空格貌似是因为UTF8开头有三个表明编码的 ...

1. ASCII哪来的中文字符……
2. 这个我知道,但是我无法重现这个问题。我这边一切正常
作者: test    时间: 2014-4-14 20:12
taroxd 发表于 2014-4-14 20:04
1. ASCII哪来的中文字符……
2. 这个我知道,但是我无法重现这个问题。我这边一切正常 ...

用windows系统自带的记事本保存为utf-8编码时就会有了。
utf-8有两种,一种带有BOM的UTF-8,一种是无BOM的UTF-8,保存为无bom的utf-8就不会有那前3个字节了。
作者: oOxinlan    时间: 2014-4-15 14:35
oOxinlan 发表于 2014-4-13 23:55
我新建了个“测试.txt”,复制了上面的代码,修改成File.open(“测试.txt”,"r")运行的时候提示找不到文 ...

不好意思,我自己忘记加“.txt”的后缀了,⊙﹏⊙b汗
作者: 喵呜喵5    时间: 2014-4-15 18:14
本帖最后由 喵呜喵5 于 2014-4-15 18:16 编辑
taroxd 发表于 2014-4-14 20:04
1. ASCII哪来的中文字符……
2. 这个我知道,但是我无法重现这个问题。我这边一切正常 ...


Project1.rar (174 Bytes, 下载次数: 45)
用来测试的文档都是用windows自带的记事本创建的,分别是ANSI编码的test1.txt以及UTF8编码的test2.txt
使用的代码是下面这段
  1. #encoding: utf-8
  2. IO.foreach('test1.txt', encoding: 'utf-8') do |line|
  3.   p line.chomp
  4. end
复制代码
程序运行以后的最终效果是这样:

作者: taroxd    时间: 2014-4-16 06:44
喂ANSI和ASCII差远了吧……

要读取,把utf-8改成GB2312就好了吧

另外我这边上学中,没有RM环境无法测试
作者: fux2    时间: 2014-4-17 07:53
我怎么感觉读全部文本,直接用read就行?
  1. File.open("fucker.txt").read
复制代码





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1