Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文件检查和打印_C#_File Io - Fatal编程技术网

C# 文件检查和打印

C# 文件检查和打印,c#,file-io,C#,File Io,我正在编写一个程序,一次打开一个文件,对其进行解析,并将解析后的数据输出到一个新的.txt文档中,该文档根据传入的文件命名。将要读取和解析的文件超过50个 因此,如果打开的文件命名如下:STACK-OVERFLOW-125663-D2.txt,则输出文件将类似于125663-D2.txt 每次读取文件时,都会对其零件号进行解析。每个文件将包含与此类似的行(第8个分隔的逗号值(即119082、119083、119040、119085、119084)是零件号值): 现在我需要做的是检查另一个.txt

我正在编写一个程序,一次打开一个文件,对其进行解析,并将解析后的数据输出到一个新的.txt文档中,该文档根据传入的文件命名。将要读取和解析的文件超过50个

因此,如果打开的文件命名如下:
STACK-OVERFLOW-125663-D2.txt
,则输出文件将类似于
125663-D2.txt

每次读取文件时,都会对其零件号进行解析。每个文件将包含与此类似的行(第8个分隔的逗号值(即119082、119083、119040、119085、119084)是零件号值):

现在我需要做的是检查另一个.txt文件。。假设它名为“DATABASE.txt”,以查看这些零件号是否已经存在于其中。此数据库文件的外观如下所示:

119082:    125663-D2, 123456-A1,
119083:    125663-D2,
119085:    125663-D2, 123456-A1, 987654321-Z11234, 1111111-B50
因此,在DATABASE.txt文件和上面打开的文件中,我想检查打开的文件中的所有零件号,看看它们是否存在于数据库中

  • 如果零件确实存在,我想将文件名(输出文件)连接到零件号所在行的末尾

  • 如果零件不存在,我想将零件添加到文件中,并使用
    list.sort()
    对文件进行排序

我不知道怎么做,有人能帮忙吗


以下是我到目前为止的一些代码:

List<string> partNumberLines = new List<string>();
string file = openFile.FileName;
string splitFile = file.Split('\\');
string[] savedName = splitFile[splitFile.Length - 1].Split('.');
string[] lineNumber = savedNamed[2].Split('-');
string fileName = savedNamed[1] + "-" + lineNumber[0] + ".txt";

foreach (string line in fileList)
{
    string[] splitLine = line.Split('\n');
    for (int i = 0; i < splitLine.Length; i++)
    {
        string tempSplit = splitLine[i].Split(',');  // splits each line by commas
        if (tempSplit.Length.Equals(16))
        {
            tempSplit[7] = tempSplit[7].TrimStart('"');  //trims the quotes from the part numbers
            tempSplit[7] = tempSplit[7].TrimEnd('"');
        }
    }
}
partNumberLines = partNumberLines.Distinct().ToList();  //gets rid of duplicate partnumbers in one file.
List partNumberLines=new List();
string file=openFile.FileName;
string splitFile=file.Split('\\');
字符串[]savedName=splitFile[splitFile.Length-1].Split('.');
字符串[]lineNumber=savedNamed[2]。拆分('-');
字符串文件名=savedNamed[1]+“-”+行号[0]+“.txt”;
foreach(文件列表中的字符串行)
{
string[]splitLine=line.Split('\n');
对于(int i=0;i

所以我的代码是获取所有零件号和文件名。。我只是不知道如何打开一个现有的文件(如果它不存在,就创建它),搜索文件并在列表中查找匹配项:
partNumberLines
。如果匹配,将文件名添加到当前行。如果不匹配,则创建新行并添加零件号和文件名,然后按零件号对文件进行数字排序


有人能帮我解决这个问题吗?

不要自己解析CSV。用图书馆来做那个。可能会有很多异常,FileHelper可以很好地处理这些异常

其次,如果一个简单的数据库可能会有所帮助,那么您已经做了足够多的数据操作。可能是SQL Express,也可能是单文件嵌入式数据库(SQL Server Compact,SQLite)

最后,要手动执行此操作,只需在内存中构建表。您真正拥有的是零件号和文件之间的多对多关系。因此,您有两个表,中间有一个联接表

现在,由于“filename”在您的示例中只有一个属性(filename),因此可以将其作为附加列附加到联接表中。你有两张桌子。第二个看起来像

JoinTable
-------------------
PartNum | Varchar
Filename| Varchar
您已经拥有的第一张桌子

因此,如果您使用
List
在内存中复制这两个表,您应该能够使用LINQ轻松地完成这项工作。虽然就我个人而言,我会构建新的类或至少是结构来表示两个表元组


希望这有帮助。

希望你没有放弃。这是一个示例类。我已经完成了上一篇文章。将上面的数据库数据保存到
database.txt
,将零件数据保存到
parts.txt
,并修改路径以查看其工作方式。希望对你有帮助。如果您还有任何问题,请随时提问

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        private class DataBaseRecord
        {
            public string PartNumber { get; set; }
            public List<string> FileNames { get; set; }
            public DataBaseRecord(string _PartNumber, List<string> _FileNames)
            {
                PartNumber = _PartNumber;
                FileNames = _FileNames;
            }
        }

        private class DataBase
        {
            public string databaseFile { get; set; }
            List<DataBaseRecord> records;
            public DataBase(string _databaseFile)
            {
                databaseFile = _databaseFile;
                records = new List<DataBaseRecord>();
            }
            public void AddRecord(string partNumber, string fileName)
            {
                if (string.IsNullOrWhiteSpace(partNumber))
                    return;

                if (string.IsNullOrWhiteSpace(fileName))
                    return;

                bool exists = records.Count(x => x.PartNumber == partNumber) > 0;
                if (!exists)
                {
                    records.Add(new DataBaseRecord(partNumber, new List<string>() { fileName }));
                }
                else
                {
                    var record = from x in records where x.PartNumber == partNumber select x;
                    foreach (DataBaseRecord dbr in record)
                    {
                        exists = dbr.FileNames.Count(x => x == fileName) > 0;
                        if (!exists)
                            dbr.FileNames.Add(fileName);
                    }
                }
            }
            public void Read()
            {
                // read all database records into data structure
                using (StreamReader sr = new StreamReader(databaseFile))
                {
                    while (!sr.EndOfStream)
                    {
                        string line = sr.ReadLine();
                        string partNumber = line.Split(':')[0].Trim();
                        if (partNumber[0] == '\"')
                            partNumber = partNumber.Substring(1, partNumber.Length - 2);
                        string[] files = line.Split(new string[]{":"}, StringSplitOptions.None)[1].Split(new string[]{","}, StringSplitOptions.RemoveEmptyEntries);
                        List<string> fileNumbers = new List<string>();
                        foreach (String file in files)
                        {
                            if (!string.IsNullOrWhiteSpace(file))
                            {
                                fileNumbers.Add(file.Trim());
                            }
                        }
                        records.Add(new DataBaseRecord(partNumber, fileNumbers));
                    }
                }
            }
            public void Write()
            {
                // write out database using the records
                var sortedRecords = from x in records orderby x.PartNumber select x;
                using (StreamWriter sw = new StreamWriter(databaseFile))
                {
                    foreach (DataBaseRecord record in sortedRecords)
                    {
                        string line = record.PartNumber + ": ";
                        for (int index = 0; index < record.FileNames.Count; index++)
                        {
                            line += record.FileNames[index];
                            if (index < record.FileNames.Count - 1)
                                line += ", ";
                        }
                        sw.WriteLine(line);
                    }
                }
            }
        }

        static void Main(string[] args)
        {
            // replace with name of your database
            DataBase db = new DataBase(@"C:\Users\jondoe\Desktop\DataBase.txt");
            db.Read();

            // replace with list of your parts files
            string[] partsFiles = new string[] { @"C:\Users\jondoe\Desktop\parts.txt" };
            foreach (string partsFile in partsFiles)
            {
                using (StreamReader sr = new StreamReader(partsFile))
                {
                    while (!sr.EndOfStream)
                    {
                        string line = sr.ReadLine();
                        string partNumber = line.Split(new string[] { "," }, StringSplitOptions.None)[7];
                        if (partNumber[0] == '\"')
                            partNumber = partNumber.Substring(1, partNumber.Length - 2);
                        db.AddRecord(partNumber, Path.GetFileNameWithoutExtension(partsFile));
                    }
                }                
            }

            db.Write();
        }
    }
}

这里有一个快速的例子。。它肯定需要改进,但这只是一个开始:)

使用系统;
使用System.Collections.Generic;
使用系统配置;
使用System.IO;
使用System.Linq;
使用系统文本;
命名空间控制台应用程序2
{
公共类文件
{
专用词典数据库;
private const string DATABASE_PATH=@“D:\Temp\Test\DATABASE.txt”;
公开募捐
{
var files=新列表{@“D:\Temp\Test\Test1.txt”、@“D:\Temp\Test\Test2.txt”、@“D:\Temp\Test\Test3.txt”};
dataBase=GetDatabase();
foreach(文件中的var文件)
{
搜索(文件,获取零件号(文件));
}
WriteFileContent(数据库_路径,BuildPartsDbStr());
}
私有无效搜索(字符串文件名,列表部分nums)
{
foreach(partNums中的var partNum)
{
var path=path.GetFileNameWithoutExtension(文件名);
if(dataBase.Keys.Contains(partNum))
{
数据库[partNum]。添加(路径);
}
其他的
{
Add(partNum,新CommaDelimitedStringCollection{path});
}
}
}
私有字符串BuildPartsDbStr()
{
var sb=新的StringBuilder();
var db=数据库orderby x中的x。键选择x;
foreach(数据库中的var记录)
{
AppendLine(string.Format(“{0}:{1}”,record.Key,record.Value));
}
使某人返回字符串();
}
私有字典GetDatabase()
{
var contents=GetFileContents(数据库路径);
var commaStr=new CommaDelimitedStringCollection();
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        private class DataBaseRecord
        {
            public string PartNumber { get; set; }
            public List<string> FileNames { get; set; }
            public DataBaseRecord(string _PartNumber, List<string> _FileNames)
            {
                PartNumber = _PartNumber;
                FileNames = _FileNames;
            }
        }

        private class DataBase
        {
            public string databaseFile { get; set; }
            List<DataBaseRecord> records;
            public DataBase(string _databaseFile)
            {
                databaseFile = _databaseFile;
                records = new List<DataBaseRecord>();
            }
            public void AddRecord(string partNumber, string fileName)
            {
                if (string.IsNullOrWhiteSpace(partNumber))
                    return;

                if (string.IsNullOrWhiteSpace(fileName))
                    return;

                bool exists = records.Count(x => x.PartNumber == partNumber) > 0;
                if (!exists)
                {
                    records.Add(new DataBaseRecord(partNumber, new List<string>() { fileName }));
                }
                else
                {
                    var record = from x in records where x.PartNumber == partNumber select x;
                    foreach (DataBaseRecord dbr in record)
                    {
                        exists = dbr.FileNames.Count(x => x == fileName) > 0;
                        if (!exists)
                            dbr.FileNames.Add(fileName);
                    }
                }
            }
            public void Read()
            {
                // read all database records into data structure
                using (StreamReader sr = new StreamReader(databaseFile))
                {
                    while (!sr.EndOfStream)
                    {
                        string line = sr.ReadLine();
                        string partNumber = line.Split(':')[0].Trim();
                        if (partNumber[0] == '\"')
                            partNumber = partNumber.Substring(1, partNumber.Length - 2);
                        string[] files = line.Split(new string[]{":"}, StringSplitOptions.None)[1].Split(new string[]{","}, StringSplitOptions.RemoveEmptyEntries);
                        List<string> fileNumbers = new List<string>();
                        foreach (String file in files)
                        {
                            if (!string.IsNullOrWhiteSpace(file))
                            {
                                fileNumbers.Add(file.Trim());
                            }
                        }
                        records.Add(new DataBaseRecord(partNumber, fileNumbers));
                    }
                }
            }
            public void Write()
            {
                // write out database using the records
                var sortedRecords = from x in records orderby x.PartNumber select x;
                using (StreamWriter sw = new StreamWriter(databaseFile))
                {
                    foreach (DataBaseRecord record in sortedRecords)
                    {
                        string line = record.PartNumber + ": ";
                        for (int index = 0; index < record.FileNames.Count; index++)
                        {
                            line += record.FileNames[index];
                            if (index < record.FileNames.Count - 1)
                                line += ", ";
                        }
                        sw.WriteLine(line);
                    }
                }
            }
        }

        static void Main(string[] args)
        {
            // replace with name of your database
            DataBase db = new DataBase(@"C:\Users\jondoe\Desktop\DataBase.txt");
            db.Read();

            // replace with list of your parts files
            string[] partsFiles = new string[] { @"C:\Users\jondoe\Desktop\parts.txt" };
            foreach (string partsFile in partsFiles)
            {
                using (StreamReader sr = new StreamReader(partsFile))
                {
                    while (!sr.EndOfStream)
                    {
                        string line = sr.ReadLine();
                        string partNumber = line.Split(new string[] { "," }, StringSplitOptions.None)[7];
                        if (partNumber[0] == '\"')
                            partNumber = partNumber.Substring(1, partNumber.Length - 2);
                        db.AddRecord(partNumber, Path.GetFileNameWithoutExtension(partsFile));
                    }
                }                
            }

            db.Write();
        }
    }
}
private void btnOpenFile_Click(object sender, EventArgs e)
{
    DataBase db = new DataBase(@"C:\Users\JonDoe\Desktop\DataBase.txt");
    db.Read();

    using (OpenFileDialog ofd = new OpenFileDialog())
    {
        if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            using (StreamReader sr = new StreamReader(ofd.FileName))
            {
                while (!sr.EndOfStream)
                {
                    string line = sr.ReadLine();
                    string partNumber = line.Split(new string[] { "," }, StringSplitOptions.None)[7];
                    if (partNumber[0] == '\"')
                        partNumber = partNumber.Substring(1, partNumber.Length - 2);
                    db.AddRecord(partNumber, Path.GetFileNameWithoutExtension(ofd.FileName));
                }
            }
            db.Write();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    public class FileIo
    {
        private Dictionary<int, CommaDelimitedStringCollection> dataBase;
        private const string DATABASE_PATH = @"D:\Temp\Test\DATABASE.txt";

        public void Run()
        {
            var files = new List<string> { @"D:\Temp\Test\Test1.txt", @"D:\Temp\Test\Test2.txt", @"D:\Temp\Test\Test3.txt" };

            dataBase = GetDatabase();

            foreach (var file in files)
            {
                Search(file, GetPartNumbers(file));  
            }

            WriteFileContents(DATABASE_PATH, BuildPartsDbStr());
        }

        private void Search(string fileName, List<int> partNums)
        {
            foreach (var partNum in partNums)
            {
                var path = Path.GetFileNameWithoutExtension(fileName);
                if (dataBase.Keys.Contains(partNum))
                {
                    dataBase[partNum].Add(path);
                }
                else
                {
                    dataBase.Add(partNum, new CommaDelimitedStringCollection { path });
                }
            }
        }

        private string BuildPartsDbStr()
        {
            var sb = new StringBuilder();
            var db  = from x in dataBase orderby x.Key select x;

            foreach (var record in db)
            {
                sb.AppendLine(string.Format("{0}: {1}", record.Key, record.Value));
            }

            return sb.ToString();
        }

        private Dictionary<int, CommaDelimitedStringCollection> GetDatabase()
        {
            var contents = GetFileContents(DATABASE_PATH);
            var commaStr = new CommaDelimitedStringCollection();
            var db = new Dictionary<int, CommaDelimitedStringCollection>();
            var id = 0;
            var collection = new CommaDelimitedStringCollection();

            for (var i = 0; i < commaStr.Count; i++ )
            {
                var str = commaStr[i];
                if (str.Contains(":"))
                {
                    collection.Add(str.Split(':')[1]);
                    if (i > 0) db.Add(id, collection);
                    collection = new CommaDelimitedStringCollection();
                    id = int.Parse(str.Split(':')[0]);
                }
                else
                {
                    collection.Add(str);
                }
            }

            return db;
        }

        private List<int> GetPartNumbers(string filePath)
        {
            var contents = GetFileContents(filePath);
            var commaStr = new CommaDelimitedStringCollection();
            var result = new List<int>();                

            commaStr.AddRange(contents.Split(','));

            for(var i = 7; i < commaStr.Count; i += 15)
            {
                result.Add(int.Parse(commaStr[i].Replace("\"", string.Empty)));
            }

            return result;
        } 


        private string GetFileContents(string path)
        {
            using (var stream = new StreamReader(path))
            {
                //yes I know this is evil - I don't have all night :P
                return stream.ReadToEnd();
            }
        }

        private void WriteFileContents(string path, string contents)
        {
            using (var stream = new StreamWriter(path, false))
            {
                stream.Write(contents);
                stream.Flush();
            }
        }

    }
}