将.csv文件导入listview

时间:2015-08-01 16:41:05

标签: c#

我正在尝试将.csv文件加载到listview中:

        ofDialog.Filter = @"CSV Files|*.csv";
        ofDialog.Title = @"Select your backlink file...";
        ofDialog.FileName = "backlinks.csv";

        // is cancel pressed?
        if (ofDialog.ShowDialog() == DialogResult.Cancel)
            return;
        try
        {
            string filename = ofDialog.FileName;
            var lines = File.ReadAllLines(filename);
            foreach (string line in lines)
            {
                var parts = line.Split('    ');
                ListViewItem lvi = new ListViewItem(parts[0]);
                lvi.SubItems.Add(parts[1]);
                listViewMain.Items.Add(lvi);
            }
            // update count
            Helpers.returnMessage(File.ReadAllLines(ofDialog.FileName).Count() + " rows imported.");
        }
        catch (Exception ex)
        {
            Helpers.returnMessage(ex.Message);
        }

csv内容如下:

    URL Rating  Domain Rating   IP From Referring Page URL  Referring Page Title    Internal Links Count    External Links Count    Link URL    TextPre Link Anchor TextPost    Size    Type    NoFollow    Site-wide   Image   Encoding    Alt First Seen  Previous Visited    Last Check  Original
    24  89  91.198.174.192  http://en.wikipedia.org/wiki/Humbug_(sweet) "Humbug (sweet) - Wikipedia, the free encyclopedia" 118 16  http://www.bestbritishsweets.co.uk/user/products/large/everton.jpg      http://www.bestbritishsweets.co.uk/user/products/large/everton.jpg      12163   href    True    False   False   utf8        2013-09-08T15:14:50Z    2015-03-11T01:48:40Z    2015-03-11T01:48:40Z    True

没有devels“,”就像普通的.csv文件一样,并且在某些字段之间有不同的空格,我坚持分割每个部分并添加到listview的最佳方法,我有一个心理块lol < / p>

任何帮助将不胜感激:)

欢呼人们

格雷厄姆

1 个答案:

答案 0 :(得分:0)

要打开CSV文件,我首先会检查它不是制表符分隔文件,您可以使用\t作为分隔符,以与您类似的方式读取文件。

如果失败了,您可以使用(非常长且复杂的)正则表达式字符串将不同的“列”作为不同的部分进行匹配。正则表达式字符串看起来像:

\s+([0-9]*)\s+([0-9]*)\s+([0-9]*.[0-9]*.[0-9]*.[0-9]*)\s+([a-zA-Z:\/._\(\)]*)\s+(\"[a-zA-Z0-9 \-\(\),]*\")\s+([0-9]*)\s+([0-9]*)\s+([a-zA-Z:\/._\(\)]*)\s+([a-zA-Z:\/._\(\)]*)\s+([0-9]*)\s+([a-zA-Z]*)\s+(True|False)\s+(True|False)\s+(True|False)\s+([a-z0-9]*)\s+([0-9\-T:Z]*)\s+([0-9\-T:Z]*)\s+([0-9\-T:Z]*)\s+(True|False)

这会将每列作为不同的组返回,您可以访问以下详细信息:

var regex = new Regex(regexString);
foreach(var line in lines)
{
    var match = regex.Match(line);
    var urlRating = match.Groups[0].Value;
    var domainRating = match.Groups[1].Value;
    var ip = match.Groups[2].Value;
    // ...
}

您可以在此处查看有关我创建的正则表达式字符串的更多信息(并可能为其他行简化/扩展):https://regex101.com/r/oN4tW3/1

有关C#正则表达式的更多信息,请查看此处:https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex(v=vs.110).aspx

编辑:我会避免使用正则表达式方法,如果它是标签分隔,因为它更复杂和脆弱