簡體   English   中英

C#字符串解析

[英]C# string parse

我有這樣的字符串

string temp = "'ADDR_LINE_2','MODEL','TABLE',5,'S','Y','C40','MUL,NBLD,NITA,NUND','','Address line 2'"

每對單引號都是一個以逗號分隔的字段。 我想清空字符串中的第8個字段。 我不能簡單地執行replace("MUL,NBLD,NITA,NUND","")因為該字段可以包含任何內容。 還請注意,第4個字段是數字,因此在5周圍沒有單引號。

我該如何實現?

static void Main()
{
    var temp = "'ADDR_LINE_2','MODEL','TABLE',5,'S','Y','C40','MUL,NBLD,NITA,NUND','','Address line 2'";

    var parts = Split(temp).ToArray();
    parts[7] = null;
    var ret = string.Join(",", parts);

    // or replace the above 3 lines with this...        
    //var ret = string.Join(",", Split(temp).Select((v,i)=>i!=7 ? v : null));

    //ret == "'ADDR_LINE_2','MODEL','TABLE',5,'S','Y','C40',,'','Address line 2'"
}

public static IEnumerable<string> Split(string input, char delimiter = ',', char quote = '\'')
{
    string temp = "";
    bool skipDelimiter = false;

    foreach (var c in input)
    {
        if (c == quote)
            skipDelimiter = !skipDelimiter;
        else if (c == delimiter && !skipDelimiter)
        {
            //do split
            yield return temp;
            temp = "";
            continue;
        }

        temp += c;
    }
    yield return temp;
}

我在下面做了一個小實現。 我在評論中解釋了邏輯。 基本上,您想編寫一個簡單的解析器來完成您描述的內容。

edit0:剛意識到我做的與您要求的相反。.現在修復

edit1:將字符串替換為null,而不是從逗號分隔的列表中刪除整個字段。

    static void Main(string[] args)
    {
        string temp = "'ADDR_LINE_2','MODEL','TABLE',5,'S','Y','C40','MUL,NBLD,NITA,NUND','','Address line 2'";
        //keep track of the single quotes
        int singleQuoteCount= 0;
        //keep track of commas
        int comma_count = 0;
        String field = "";
        foreach (Char chr in temp)
        {
            //add to the field string if we are not between the 7th and 8th comma not counting commas between single quotes
            if (comma_count != 7)
                field += chr;
            //plug in null string between two single quotes instead of whatever chars are in the eigth field.
            else if (chr == '\'' && singleQuoteCount %2 ==1)
                field += "\'',";

            if (chr == '\'') singleQuoteCount++;
            //only want to add to comma_count if we are outside of single quotes.
            if (singleQuoteCount % 2 == 0 && chr == ',') comma_count++;

        }
    }

如果在字段內(例如:“ MUL-NBLD-NITA-NUND”)使用“-”(或其他字符)代替“,”,則可以使用以下代碼:

    static void Main(string[] args)
    {
        string temp = "'ADDR_LINE_2','MODEL','TABLE',5,'S','Y','C40','MUL-NBLD-NITA-NUND','','Address line 2'";
        temp = replaceField(temp, 8);
    }

    static string replaceField(string list, int field)
    {
        string[] fields = list.Split(',');
        string chosenField = fields[field - 1 /*<--Arrays start at 0!*/];

        if(!(field == fields.Length))
            list = list.Replace(chosenField + ",", "");
        else
            list = list.Replace("," + chosenField, "");

        return list;
    }

    //Return-Value: "'ADDR_LINE_2','MODEL','TABLE',5,'S','Y','C40','','Address line 2'"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM