0

我有一个包含大约 8000 行的文本文件。每行必须有 90 个字符。每行包含不同的块,所以我必须为每个块使用子字符串。例如。xx-xxxxxxxxx-xx-xxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxx

我使用 Substring(x,x) 来获取 for 循环中的每个块。

有些行没有 122 个字符,

例如。xx-xxxxxxxxx-xx-xxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx-xxxxx

所以我想跳过这些行并为其他人继续。我不明白在 C# 中正确使用 String.Skip 函数。

这是我的代码。

public void getext()
{

    // bool check = false;
    MySqlConnectionStringBuilder con = new MySqlConnectionStringBuilder();
    con.Server = "xxx";
    con.UserID = "xxx";
    con.Password = "xxx";
    con.Database = "xxx";
    MySqlConnection sqlcon = new MySqlConnection(con.ToString());
    string padding = "";

    try
    {
        sqlcon.Open();
        //var watch = System.Diagnostics.Stopwatch.StartNew();
        var path = "C:\\xxx\\xxx\\xxx\\1.txt";
        var lines = File.ReadAllLines(path);
        for (var i = 0; i < lines.Length; i += 1)
        {
            string str = lines[i].ToString();
            string code, control1, actype, control2, filler, control3, sponsor,
            control4, amtdate, control5;                
            code = str.Substring(0, 2);
            control1 = str.Substring(2, 9);
            actype = str.Substring(11, 2);
            control2 = str.Substring(13, 18);
            filler = str.Substring(31, 40);
            control3 = str.Substring(74, 16);
            sponsor = str.Substring(90, 20);                
            MySqlCommand cmd = new MySqlCommand("addext", sqlcon);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("code", MySqlDbType.VarChar).Value = code;
            cmd.Parameters.Add("control1", MySqlDbType.VarChar).Value = control1;
            cmd.Parameters.Add("actype", MySqlDbType.VarChar).Value = actype;
            cmd.Parameters.Add("control2", MySqlDbType.VarChar).Value = control2;
            cmd.Parameters.Add("filler", MySqlDbType.VarChar).Value = filler;
            cmd.Parameters.Add("control3", MySqlDbType.VarChar).Value = control3;
            cmd.Parameters.Add("sponsor", MySqlDbType.VarChar).Value = sponsor;                
            cmd.ExecuteNonQuery();
            //sqlcon.Close();
            label1.Visible = true;
            //sqlcon.Close();
            //watch.Stop();
            //var elapsedMs = watch.Elapsed.TotalMinutes;
            label1.Text = "success";
            // sqlcon.Close();

        }
        sqlcon.Close();
    }
    catch (Exception ex)
    {
        label1.Visible = true;
        label1.Text = "fail" + ex.ToString();
    }

}
4

2 回答 2

2

如果你想在你的循环中跳过一个数字/行,你可以使用

continue;

例子:

for (var i = 0; i < lines.Length; i += 1)
{
    string str = lines[i];

    if (str.length != 122) // We only want to Work with lines which are 122 chars long.
        continue;

    DoWork(); // Insert you code here ;)
}
于 2019-01-07T07:24:27.017 回答
0

我相信您想跳过少于 122 个字符的行?您可以将它们从循环中过滤掉并仅处理具有所需长度的那些。

foreach(var str in lines.Where(x=>x.Length>=122))
{
string code, control1, actype, control2, filler, control3, sponsor,
            control4, amtdate, control5;                
code = str.Substring(0, 2);

// rest of your code
}

Filter 和 Foreach 方法将远离索引,增加代码的可读性

于 2019-01-07T07:32:26.240 回答