zoukankan      html  css  js  c++  java
  • LUA实现单词替换功能

    背景描述

    编程或者文档处理过程, 经常遇到需要将一个单词修改为另外一个单词的情况, 例如 命名为 shall 修改 为 should。

    使用工具实现, 则比较方便,不容易出错, 解放双手。

    需求规格

    对于某个文件夹中的所有文本文件(txt), 将某个单词替换为目标单词。

    实现思路

    对于替换的单词映射, 在配置文件config.lua进行设置, 存储一个表,表中每一行 对应  src vocanbulary 和 dest vocanbulary

    对应工具的主题逻辑代码在 replace.lua中实现,

    待替换的文本文件存储在 replaceFiles文件夹下。

    总体目录结果如下:

    │  config.lua
    │  replace.lua
    │ 
    └─replaceFiles
            test.txt

    代码说明

    代码实现路径:

    https://github.com/fanqingsong/code-snippet/tree/master/lua/replace

    config.lua

    -- ttanslating table, in every line first word is source, second word is destination
    trans_table_string = [[
        you  lucy
    ]]

    待替换文件 test.txt


    I love you

    replace.lua工具逻辑代码实现

    --[[
    /*******************************************************************************
    *  Author:
    *  Date:
    *  Description: set config for replace, replace by config in files of target path
    *  Changes:
    *******************************************************************************/
    ]]

    local require = require
    local io = io
    local ipairs = ipairs
    local assert = assert
    local print = print
    local string = string
    local lfs = require"lfs"

    local transFilePath = "./replaceFiles"

    string.split = function(str, pat, max, regex)
        pat = pat or " "
        max = max or #str

        local t = {}
        local c = 1

        if #str == 0 then
            return {""}
        end

        if #pat == 0 then
            return nil
        end

        if max == 0 then
            return str
        end

        repeat
            local s, e = str:find(pat, c, not regex)
            max = max - 1
            if s and max < 0 then
                t[#t+1] = str:sub(c)
            else
                t[#t+1] = str:sub(c, s and s - 1)
            end
            c = e and e + 1 or #str + 1
        until not s or max < 0

        return t
    end

    ------------------------------------------  parse start ------------------------------------------
    local trans_vocabulary_table = {
        --["sourcevocabulary"] = "destvocabulary"
    }

    local function construct_vocabulary_table()
        require("config")
       
        print("parse trans_table starting .....")
       
        -- 禄帽募镁?拢卢 禄禄?路没  潞?
        local lineSep = " "
        if string.find(trans_table_string, " ") then
            lineSep = " "
        elseif string.find(trans_table_string, " ") then
            lineSep = " "
        elseif string.find(trans_table_string, " ") then
            lineSep = " "
        end

        local lines = trans_table_string:split(lineSep)

        for _,line in ipairs(lines) do
            print("line="..line)


            local src, dest = string.match(line, "([%w_]+)%s+([%w_]+)")

            if src then
                print("well formed line="..line)
               
                trans_vocabulary_table[src] = dest
            end
        end
     
          print("parse trans_table ending .....")
       
    end

    -- parse table
    construct_vocabulary_table()

    ------------------------------------------  parse end ------------------------------------------


    ------------------------------------------  read file list start ------------------------------------------
    local targetFiles = {}

    local function infilter(file, filters)
        if filters == nil or filters == "*" then
            return true
        end

        for _, v in pairs(filters) do
            if string.find(file, "%."..v.."$") then
                return true
            end
        end
       
        return false
    end

    local function splitonlast (path, sep)
        local dir, file = string.match(path,"^(.-)([^:/\]*)$")
        return dir, file
    end

    function readdir(dir, filelist, filters)
        for file in lfs.dir(dir) do
            if file ~= ".." and file ~= "." then
                local f = dir.."/"..file
                if lfs.attributes(f).mode == "directory" then
                    readdir(f, filelist, filters)
                else
                    if infilter(file, filters) then
                        table.insert(filelist, f)
                    end
                end
            end
        end
    end

    readdir(transFilePath, targetFiles, {"*"})

    for _,file in ipairs(targetFiles) do
        --print("c file =".. file)
    end

    ------------------------------------------  read file list end ------------------------------------------


    ------------------------------------------  handle file start ------------------------------------------

    local function handle_file(file)
        local lineBuff = {}

        -- ?赂?搂?
        local fh = assert(io.open (file, "rb"))
        local contents = fh:read("*a")
        fh:close()
        --print(contents)
        for src,dest in pairs(trans_vocabulary_table) do
            print(src.."==>"..dest)
            contents = string.gsub(contents, src, dest)
        end

    --[[
        -- 禄帽募镁?拢卢 禄禄?路没  潞?
        local lineSep = " "
        if string.find(contents, " ") then
            lineSep = " "
        elseif string.find(contents, " ") then
            lineSep = " "
        elseif string.find(contents, " ") then
            lineSep = " "
        end

        local fileLines = string.split(contents, lineSep)

        for _,line in ipairs(fileLines) do
            --print(" handle_file line= "..line)
               
            local gotPattern = false
            for src,dest in pairs(trans_vocabulary_table) do
                --print("src="..src.."----")
                local s, e = string.find(line, "%s-%(%s-"..src.."%s-,%s-%"")
                if s then
                    print("!!!! ------- gotPattern ------- src ="..src)

                    gotPattern = true

                    -- the part before OssUsersrc
                    local head = string.sub(line, 1, s-1)
                    -- tail part = now");
                    --print(head)
                    local tail = string.sub(line, e+1)
                    --print("tail="..tail)
                    --print("tail[1]="..string.sub(tail, 1,1))

                    -- OssUserLogType(LOG_LEVEL_NOTICE, LOG_TYPE_SYSTEM, "the system will reboot now");
                    local level = dest["level"]
                    local types = dest["types"]
                    local msg = dest["msg"]

                    local sep = " "
                    if msg == "" then
                        sep = ""               
                    elseif string.sub(tail, 1,1) == """ then
                        sep = ""
                    end
                    --print("msg="..msg.."sep="..sep.."--")
                    local transLine = head .. "OssUserLogType(" .. level ..", " .. types .. ", "" .. msg .. sep .. tail

                    table.insert(lineBuff, transLine)

                    if gotPattern then
                        break
                    end

                end
            end

            if not gotPattern then
                table.insert(lineBuff, line)
            end
        end
       
    ]]
        --write buff to orig file
        local fh = assert(io.open(file, "wb"))
        fh:write(contents)
        fh:close()
    end

    for _,file in ipairs(targetFiles) do
        print("handling file =".. file)
        handle_file(file)
    end

    ------------------------------------------  handle file end ------------------------------------------

    运行结果

    root@fqs:/home/share/luascript/replace# cat ./replaceFiles/test.txt

    I love you


    root@fqs:/home/share/luascript/replace# lua replace.lua
    parse trans_table starting .....
    line=    you  lucy
    well formed line=    you  lucy
    line=
    parse trans_table ending .....
    handling file =./replaceFiles/test.txt
    you==>lucy
    root@fqs:/home/share/luascript/replace#
    root@fqs:/home/share/luascript/replace#
    root@fqs:/home/share/luascript/replace# cat ./replaceFiles/test.txt

    I love lucy


    root@fqs:/home/share/luascript/replace#

  • 相关阅读:
    cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检測(1)
    Android给定坐标计算距离
    LeetCode——Gray Code
    hdu 1203
    2015 年度新增开源软件排名TOP100
    compact处理流程分析
    ExtJs--06--Ext.WindowGroup相关方法简单使用
    android4.4的两个bug
    高阶MapReduce_1_链接多个MapReduce作业
    如何设置eclipse格式化xml代码时不自动换行
  • 原文地址:https://www.cnblogs.com/lightsong/p/5575985.html
Copyright © 2011-2022 走看看