-3

此代码工作正常,但我的问题是我需要读取包含 ESSD 的文件,如果此文件在某行中包含名称,请将其添加到我的 listbox1 中,如果它不包含该行中的名称,请不要将其添加到列表框 1。

谢谢。

private void button1_Click(object sender, EventArgs e)
    {
        DialogResult result = this.openFileDialog1.ShowDialog();
        if (result == DialogResult.OK)
        {
            string[] Nomarchivo = this.openFileDialog1.FileNames;
            string NomDirec = Path.GetDirectoryName(Nomarchivo[0]);
            for (int a = 0; a <= Nomarchivo.Length - 1; a++)
            {
                string NomDirGral = Nomarchivo[a].Remove(Nomarchivo[a].Length - 7, 7);
                string NomGral = NomDirGral.Replace(NomDirec, " ");
                NomGral = NomGral.Remove(0, 2);
                foreach (string f in Directory.GetFiles(NomDirec, NomGral + "*"))
                    this.listBox1.Items.Add(f);
                foreach (string h in Directory.GetFiles(NomDirec, "resume*"))
                    this.listBox1.Items.Add(h);
                foreach (string t in Directory.GetFiles(NomDirec, "ESSD1*"))
                    this.listBox1.Items.Add(t);
            }
            string[] list1 = new string[listBox1.Items.Count];
            for (int b = 0; b <= listBox1.Items.Count - 1; b++)
            {
                list1[b] = listBox1.Items[b].ToString();
            }
            string[] list2 = list1.Distinct().ToArray();
            foreach (string g in list2)
                this.listBox2.Items.Add(g);

            Class1 arr1 = new Class1();
            arr1.array(listBox2);
        }
        else { Close(); }
    }
4

3 回答 3

0

这里有两种方法:

public static string ReadSpecificLine1( string path , int lineNumber )
{
  int cnt = 0 ;
  string desiredLine = File.ReadAllLines( path ).FirstOrDefault( x => (++cnt == lineNumber) ) ;
  return desiredLine ;
}

public static string ReadSpecificLine2( string path , int lineNumber )
{
  string desiredLine = null ;
  using ( FileStream   stream = new FileStream( path , FileMode.Open , FileAccess.Read , FileShare.Read ) )
  using ( StreamReader reader = new StreamReader( stream ) )
  {
    int    i           = 0    ;
    string line        = null ;
    while ( null != (line=reader.ReadLine()) && ++i < lineNumber )
    {
    }
    if ( i == lineNumber && line != null )
    {
       desiredLine = line ;
    }
    return desiredLine ;
  }
}

如果您确定您的文件

  • 仅包含在文件的 unicode 编码方案中构成单个、固定大小的 Unicode 代码单元的字符,并且

  • 有固定长度的行(记录)

然后您可以seek()直接到有问题的行,如本例中使用 UTF-16 编码,从而节省无关的 I/O 操作:

public static string ReadSpecificLineFromUTF16EncodedFile( string path , int lineNumber )
{
  string    desiredLine                    = null ;

  using ( FileStream   stream = new FileStream( path , FileMode.Open , FileAccess.Read , FileShare.Read ) )
  using ( StreamReader reader = new StreamReader( stream , Encoding.Unicode ) )
  {
    Encoding  UTF_16                         = Encoding.Unicode ;
    const int RECORD_LENGTH_IN_CHARS         = 80 ;
    const int FIXED_CODE_UNIT_SIZE_IN_OCTETS = sizeof(char) ; // size of a UTF-16 code unit (char) in octets
    const int RECORD_LENGTH_IN_OCTETS        = RECORD_LENGTH_IN_CHARS * FIXED_CODE_UNIT_SIZE_IN_OCTETS ;

    long offset = (lineNumber-1)*RECORD_LENGTH_IN_OCTETS ;

    if ( offset <  0 ) throw new ArgumentOutOfRangeException("lineNumber") ;
    if ( offset <= stream.Length )
    {
      stream.Seek( offset , SeekOrigin.Begin ) ;
      desiredLine = reader.ReadLine() ;
    }
  }
  return desiredLine ;
}

请注意,这在上述两个条件为真时才有效。

于 2012-09-14T19:12:28.247 回答
0

那么问题是我想访问 ESSD 文件和读取第 6 行,如果此行包含存储在 Resume 文件中的名称,则将 ESSD 文件发送到 listbox1,如果没有,则不将 ESSD 添加到我的 listbox1

所以:

  1. 读取/解析简历文件
  2. 对简历列表进行排序。
  3. 创建所有 ESSD 文件的列表
  4. 遍历所述列表,从每个文件中读取“第 6 行”
  5. 在“第 6 行”中搜索名称的简历文件
  6. 找到就添加

尝试将其添加到上面的代码中,看看会发生什么。看看情况如何,也许可以修改你的问题。

于 2012-09-14T19:19:24.123 回答
0

.NET 4 提供了一个很好的函数,称为 File.ReadLines(fileName)

使用此功能,您的上述代码可以修改为:

private void button1_Click(object sender, EventArgs e) 
{ 
    DialogResult result = this.openFileDialog1.ShowDialog(); 
    if (result == DialogResult.OK) 
    { 
        string[] Nomarchivo = this.openFileDialog1.FileNames; 
        string NomDirec = Path.GetDirectoryName(Nomarchivo[0]); 
        for (int a = 0; a <= Nomarchivo.Length - 1; a++) 
        { 

            //the name we are looking for.
            List<string> namesWeAreLookingFor = new List<string>();

            string NomDirGral = Nomarchivo[a].Remove(Nomarchivo[a].Length - 7, 7); 
            string NomGral = NomDirGral.Replace(NomDirec, " "); 
            NomGral = NomGral.Remove(0, 2); 
            foreach (string f in Directory.GetFiles(NomDirec, NomGral + "*")) 
                this.listBox1.Items.Add(f); 
            foreach (string h in Directory.GetFiles(NomDirec, "resume*")) 
            {
                this.listBox1.Items.Add(h); 

                var nameLines = File.ReadLines(NomDirec + @"\" + h);
                foreach (var item in nameLines)
                {
                    //do whatever you need to get a name in this file here
                    //...

                    //Assuming there is one name per line, add the name to the list
                    namesWeAreLookingFor.Add(item);
                }
            }
            foreach (string t in Directory.GetFiles(NomDirec, "ESSD1*")) 
            {
                this.listBox1.Items.Add(t); 
                //try to access the file so we can read line 6 using new .NET 4 method 
                var lines = File.ReadLines(NomDirec + @"\" + t);

                //see if we even have 6 lines
                if (lines.Count() < 6)
                    continue;

                String line6 = lines.ElementAt(5);

                //loop through the names we pulled
                foreach (var item in namesWeAreLookingFor)
                {
                    //see if line 6  containes that name.
                    if (line6.Contains(item))
                    {
                        //if it exists, then add it to the list and exit the loop.
                        this.listBox1.Items.Add(t);
                        break;
                    }
                }
            }
        } 
        string[] list1 = new string[listBox1.Items.Count]; 
        for (int b = 0; b <= listBox1.Items.Count - 1; b++) 
        { 
            list1[b] = listBox1.Items[b].ToString(); 
        } 
        string[] list2 = list1.Distinct().ToArray(); 
        foreach (string g in list2) 
            this.listBox2.Items.Add(g); 

        Class1 arr1 = new Class1(); 
        arr1.array(listBox2); 
    } 
    else { Close(); } 
于 2012-09-14T19:22:35.127 回答