Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何读取文件并从特定行中删除字符串_Ruby - Fatal编程技术网

Ruby 如何读取文件并从特定行中删除字符串

Ruby 如何读取文件并从特定行中删除字符串,ruby,Ruby,我有以下文件: ids_to_remove.txt ID File_Name Row Name id\a_po87y GMT_dealer auto_dev id\ruio66 dao_wells auto_dev id\rzd766 123_Smart_option cia_read ... ... etc #This configuration file was written by: org.eclipse.equinox.internal [group

我有以下文件:


ids_to_remove.txt

ID  File_Name   Row Name

id\a_po87y  GMT_dealer  auto_dev
id\ruio66   dao_wells   auto_dev
id\rzd766   123_Smart_option    cia_read
...
...
etc
#This configuration file was written by: org.eclipse.equinox.internal

[groups]

auto_dev = id\a_po87y, id\rt7890, id\sdfs09, id\rzdo9k
qa_check = id\op9iu, id\guijm0, id\a_po87y
AD_read = id\a_po87y
#Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content

[groups]

AD_read = id\a_po87y
auto_dev = id\guijm0, id\oikju8, id\ruio66
CSI = id\kiopl, id\ruio66, id\o9i8u7
GMT\u dealer-details.txt

ID  File_Name   Row Name

id\a_po87y  GMT_dealer  auto_dev
id\ruio66   dao_wells   auto_dev
id\rzd766   123_Smart_option    cia_read
...
...
etc
#This configuration file was written by: org.eclipse.equinox.internal

[groups]

auto_dev = id\a_po87y, id\rt7890, id\sdfs09, id\rzdo9k
qa_check = id\op9iu, id\guijm0, id\a_po87y
AD_read = id\a_po87y
#Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content

[groups]

AD_read = id\a_po87y
auto_dev = id\guijm0, id\oikju8, id\ruio66
CSI = id\kiopl, id\ruio66, id\o9i8u7
dao_wells-details.txt

ID  File_Name   Row Name

id\a_po87y  GMT_dealer  auto_dev
id\ruio66   dao_wells   auto_dev
id\rzd766   123_Smart_option    cia_read
...
...
etc
#This configuration file was written by: org.eclipse.equinox.internal

[groups]

auto_dev = id\a_po87y, id\rt7890, id\sdfs09, id\rzdo9k
qa_check = id\op9iu, id\guijm0, id\a_po87y
AD_read = id\a_po87y
#Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content

[groups]

AD_read = id\a_po87y
auto_dev = id\guijm0, id\oikju8, id\ruio66
CSI = id\kiopl, id\ruio66, id\o9i8u7

ids_to_remove.txt
中,有近500个条目,一行中的项目以制表符分隔。在其他文件中,组值以空格分隔

File\u Name
的值表示
E:/my\u files/*-details.txt
上的文件夹或文件,其中
*
File\u Name
值,如
GMT\u dealer
dao\u wells
123\u Smart\u选项

对于每一行,我想删除由
file\u Name
表示的文件中行ID为
row Name
的行中出现的
ID
值。例如,我想从文件
GMT\u dealer
中id为
auto\u dev
的行中删除字符串
id\a\u po87y
<代码>id\a_po87y只应从组
自动开发
中删除,组
qa_检查
AD_读取
中存在的相同id应保持原样。同样,它必须在
E:/my_files
下的所有文件上执行

我写了下面的代码:

file_dir = 'E:/my_files'

file = File.open("E:/ids_to_remove.txt", "r")
contents = file.each_line.map { |line| line.split("\t") }.transpose
id, file_name, group  = contents


id.each do |ids|
  puts "For id: #{ids}"
  file_name.each do |name| 
   value = File.open("#{file_dir}/#{name}-details.txt")
   text = File.read(value)

   text.each_line do |el|
    group.each do |gr|
     if el.match(/#{gr}/) then 
      print "group row #{gr}\n"
      replace = text.gsub( /#{Regexp.escape(ids)}\,\s/, '').gsub( /#{Regexp.escape(ids)}/, '' ).gsub /,\s*$/, ''
     end
     group.shift
    end 
   end
   file_name.shift
  end
end  
id.shift
它不能满足我的需要。寻找任何建议

为了调试,我添加了一些put和输出

For ID: id\a_po87y
group row auto_dev

group row auto_dev

For ID: id\ruio66
For ID: id\rzd766

我会这样做:

file_dir = 'E:/my_files'
file = File.open("E:/ids_to_remove.txt", "r")

file.each_line.map do |line| 
  id, file_name, group = line.split

  old_text = File.read("#{file_dir}/#{file_name}-details.txt")
  new_text = []

  old_text.each_line do |line|
    if line =~ /=/
      line_group, line_ids = line.split("=")

      if line_group.strip == group.strip
        line_ids = line_ids.split(",").reject { |l_id| l_id.strip == id }.join(",")
      end

      new_text << "#{line_group}=#{line_ids.chomp("\n")}"
    else
      new_text << line.chomp("\n")
    end

  end

  File.write("#{file_dir}/#{file_name}-details.txt", new_text.join("\n"))
end
file\u dir='E:/my\u files'
file=file.open(“E:/ids\u to\u remove.txt”、“r”)
file.each_line.map do|line|
id,文件名,组=line.split
old_text=File.read(“#{File_dir}/#{File_name}-details.txt”)
新文本=[]
旧文本。每行都有|
如果行=~/=/
行组,行ID=line.split(“=”)
如果行_group.strip==group.strip
line_id=line_id.split(“,”).reject{l_id | l_id.strip==id}.join(“,”)
结束

新的文字萨瓦-感谢编辑,我是新到这个论坛,正在调整。你能帮我解决这个问题吗?谢谢“它不能满足我的需要”——它能做什么呢?@SergioTulentsev,谢谢你的调查。它不会替换目标文件中的字符串。也没有错误。不确定我应该在哪里更改。group.shift和file\u name.shift是怎么回事?你需要它们做什么?@SergioTulentsev,我正在尝试删除所有3个数组中的第一个元素-id、group和file_name,一旦第一个id或字符串在对应行的第一个文件中被删除。我的逻辑可能是错的。请寻找你的专业建议。太棒了,为什么我没有像你一样思考:)谢谢。