<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Module%3A%E6%B2%99%E7%9B%92%2FPexEric%2Fcsv2wikitable</id>
	<title>Module:沙盒/PexEric/csv2wikitable - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Module%3A%E6%B2%99%E7%9B%92%2FPexEric%2Fcsv2wikitable"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Module:%E6%B2%99%E7%9B%92/PexEric/csv2wikitable&amp;action=history"/>
	<updated>2026-07-12T19:22:55Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=Module:%E6%B2%99%E7%9B%92/PexEric/csv2wikitable&amp;diff=4783226&amp;oldid=prev</id>
		<title>imported&gt;PexEric 来自 2025年10月12日 (日) 17:49</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Module:%E6%B2%99%E7%9B%92/PexEric/csv2wikitable&amp;diff=4783226&amp;oldid=prev"/>
		<updated>2025-10-12T17:49:39Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function parseCsv(csvText)&lt;br /&gt;
    local rows = {}&lt;br /&gt;
    local pos = 1&lt;br /&gt;
    local csvLen = #csvText&lt;br /&gt;
&lt;br /&gt;
    while pos &amp;lt;= csvLen do&lt;br /&gt;
        local row = {}&lt;br /&gt;
        while pos &amp;lt;= csvLen do&lt;br /&gt;
            local c = csvText:sub(pos, pos)&lt;br /&gt;
            if c == &amp;#039;&amp;quot;&amp;#039; then&lt;br /&gt;
                local field = &amp;quot;&amp;quot;&lt;br /&gt;
                pos = pos + 1&lt;br /&gt;
                while pos &amp;lt;= csvLen do&lt;br /&gt;
                    c = csvText:sub(pos, pos)&lt;br /&gt;
                    if c == &amp;#039;&amp;quot;&amp;#039; then&lt;br /&gt;
                        if csvText:sub(pos + 1, pos + 1) == &amp;#039;&amp;quot;&amp;#039; then&lt;br /&gt;
                            field = field .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
                            pos = pos + 2&lt;br /&gt;
                        else&lt;br /&gt;
                            pos = pos + 1&lt;br /&gt;
                            break&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        field = field .. c&lt;br /&gt;
                        pos = pos + 1&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                table.insert(row, field)&lt;br /&gt;
            else&lt;br /&gt;
                local start = pos&lt;br /&gt;
                while pos &amp;lt;= csvLen do&lt;br /&gt;
                    c = csvText:sub(pos, pos)&lt;br /&gt;
                    if c == &amp;#039;,&amp;#039; or c == &amp;#039;\n&amp;#039; or c == &amp;#039;\r&amp;#039; then break end&lt;br /&gt;
                    pos = pos + 1&lt;br /&gt;
                end&lt;br /&gt;
                table.insert(row, csvText:sub(start, pos - 1))&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            if pos &amp;gt; csvLen then break end&lt;br /&gt;
            c = csvText:sub(pos, pos)&lt;br /&gt;
            if c == &amp;#039;,&amp;#039; then&lt;br /&gt;
                pos = pos + 1&lt;br /&gt;
            elseif c == &amp;#039;\n&amp;#039; or c == &amp;#039;\r&amp;#039; then&lt;br /&gt;
                if c == &amp;#039;\r&amp;#039; and csvText:sub(pos + 1, pos + 1) == &amp;#039;\n&amp;#039; then&lt;br /&gt;
                    pos = pos + 2&lt;br /&gt;
                else&lt;br /&gt;
                    pos = pos + 1&lt;br /&gt;
                end&lt;br /&gt;
                break&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if #row &amp;gt; 0 then table.insert(rows, row) end&lt;br /&gt;
    end&lt;br /&gt;
    return rows&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function expandIfNeeded(frame, text)&lt;br /&gt;
    if not frame or text == nil or text == &amp;#039;&amp;#039; then&lt;br /&gt;
        return text or &amp;#039;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    return frame:preprocess(text)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args, frame)&lt;br /&gt;
    local csvText = args.csv or &amp;#039;&amp;#039;&lt;br /&gt;
    if csvText == &amp;#039;&amp;#039; then return &amp;#039;&amp;#039; end&lt;br /&gt;
&lt;br /&gt;
    local hasHeader = args.hasHeader and mw.text.trim(args.hasHeader):lower() == &amp;#039;true&amp;#039;&lt;br /&gt;
    local customHeaders = args.headers and mw.text.split(mw.text.trim(args.headers), &amp;#039;,&amp;#039;)&lt;br /&gt;
    local prefixes = args.prefixes and mw.text.split(mw.text.trim(args.prefixes), &amp;#039;,&amp;#039;) or {}&lt;br /&gt;
    local suffixes = args.suffixes and mw.text.split(mw.text.trim(args.suffixes), &amp;#039;,&amp;#039;) or {}&lt;br /&gt;
&lt;br /&gt;
    local rows = parseCsv(csvText)&lt;br /&gt;
    if #rows == 0 then return &amp;#039;&amp;#039; end&lt;br /&gt;
&lt;br /&gt;
    local colCount = 0&lt;br /&gt;
    for _, row in ipairs(rows) do&lt;br /&gt;
        if #row &amp;gt; colCount then colCount = #row end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for i = #prefixes + 1, colCount do prefixes[i] = &amp;#039;&amp;#039; end&lt;br /&gt;
    for i = #suffixes + 1, colCount do suffixes[i] = &amp;#039;&amp;#039; end&lt;br /&gt;
&lt;br /&gt;
    local result = {&amp;#039;{| class=&amp;quot;wikitable&amp;quot;&amp;#039;}&lt;br /&gt;
&lt;br /&gt;
    local dataStartRow = 1&lt;br /&gt;
    if hasHeader or customHeaders then&lt;br /&gt;
        table.insert(result, &amp;#039;|-&amp;#039;)&lt;br /&gt;
        local headerRow = {}&lt;br /&gt;
        if customHeaders then&lt;br /&gt;
            for i = 1, colCount do&lt;br /&gt;
                local h = customHeaders[i] or &amp;#039;&amp;#039;&lt;br /&gt;
                table.insert(headerRow, &amp;#039;! &amp;#039; .. expandIfNeeded(frame, mw.text.trim(h)))&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            local firstRow = rows[1]&lt;br /&gt;
            for i = 1, colCount do&lt;br /&gt;
                local h = firstRow[i] or &amp;#039;&amp;#039;&lt;br /&gt;
                table.insert(headerRow, &amp;#039;! &amp;#039; .. expandIfNeeded(frame, mw.text.trim(h)))&lt;br /&gt;
            end&lt;br /&gt;
            dataStartRow = 2&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(result, table.concat(headerRow, &amp;#039;\n&amp;#039;))&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- 数据行&lt;br /&gt;
    for i = dataStartRow, #rows do&lt;br /&gt;
        local row = rows[i]&lt;br /&gt;
        if #row == 0 then&lt;br /&gt;
            -- skip&lt;br /&gt;
        else&lt;br /&gt;
            table.insert(result, &amp;#039;|-&amp;#039;)&lt;br /&gt;
            local cells = {}&lt;br /&gt;
            for j = 1, colCount do&lt;br /&gt;
                local cell = row[j] or &amp;#039;&amp;#039;&lt;br /&gt;
                cell = mw.text.trim(cell)&lt;br /&gt;
                local fullText = prefixes[j] .. cell .. suffixes[j]&lt;br /&gt;
                fullText = expandIfNeeded(frame, fullText)&lt;br /&gt;
                table.insert(cells, &amp;#039;| &amp;#039; .. fullText)&lt;br /&gt;
            end&lt;br /&gt;
            table.insert(result, table.concat(cells, &amp;#039;\n&amp;#039;))&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    table.insert(result, &amp;#039;|}&amp;#039;)&lt;br /&gt;
    return table.concat(result, &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame, {&lt;br /&gt;
        trim = true,&lt;br /&gt;
        removeBlanks = false&lt;br /&gt;
    })&lt;br /&gt;
    return p._main(args, frame)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;PexEric</name></author>
	</entry>
</feed>