Thursday, 24 October 2019

append header to csv file using c#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Configuration;


namespace Header
{
    class AddHeader
    {
        static void Main(string[] args)
        {            
            string      sourceFile      = ConfigurationManager.AppSettings["sourceFilePath"];
            string      targetFile      = ConfigurationManager.AppSettings["targetFilePath"];
            string      headerFile      = ConfigurationManager.AppSettings["headerFilePath"];
            string      archiveFile     = ConfigurationManager.AppSettings["archiveFilePath"];

            string      csvContent      = string.Empty;
            string      reason          = string.Empty;
            string[]    sourceFileInfo;
            Int64       cnt             = Directory.GetFiles(sourceFile).Length;
            
            AddHeader mtx = new AddHeader();

            if (cnt > 1)
            {
                reason = "MultipleFile";
                mtx.CreateLog(reason);
            }

            else if (cnt == 0)
            {
                reason = "NoFile";
                mtx.CreateLog(reason);
            }

            else
            {
                sourceFileInfo = Directory.GetFiles(sourceFile, "*.csv", SearchOption.TopDirectoryOnly);

                foreach (string txtName in Directory.GetFiles(sourceFile, "*.csv"))
                {
                    string sourceFileName = Path.GetFileName(txtName);
                    sourceFile = sourceFile + sourceFileName;
                    targetFile = targetFile + Path.GetFileNameWithoutExtension(txtName) + System.DateTime.UtcNow.ToString("-MMddyy-hhss") + ".csv";


                    StreamReader rd = new StreamReader(headerFile, true);
                    csvContent = rd.ReadToEnd();
                    rd.Close();

                    rd = new StreamReader(sourceFile, true);
                    csvContent = csvContent.ToString() + "\n" + rd.ReadToEnd();
                    rd.Close();

                    StreamWriter wr = new StreamWriter(targetFile, false);
                    StringBuilder sb = new StringBuilder(csvContent);
                    wr.Write(sb.ToString());
                    sb.Clear();
                    wr.Close();

                    //first, delete target archive file if exists, as File.Move() does not support overwrite
                    archiveFile = archiveFile + sourceFileName;
                    if (File.Exists(archiveFile))
                    {
                        File.Delete(archiveFile);
                    }
                    File.Move(sourceFile, archiveFile);

                    reason = "Success";
                    mtx.CreateLog(reason, sourceFileName, targetFile);
                }
            }                
        }

        public void CreateLog(string _reason, string _sourceFileName = "", string _targetFile = "")
        {
            string          logFile = ConfigurationManager.AppSettings["logFilePath"];
            StreamWriter    log;
            FileStream      fileStream = null;
            DirectoryInfo   logDirInfo = null;
            FileInfo        logFileInfo;

            logFile     = logFile + "Log-Metrix-" + System.DateTime.Today.ToString("MM-dd-yyyy") + "." + "txt";
            logFileInfo = new FileInfo(logFile);
            logDirInfo  = new DirectoryInfo(logFileInfo.DirectoryName);

            if (!logDirInfo.Exists) logDirInfo.Create();

            if (!logFileInfo.Exists)
            {
                fileStream = logFileInfo.Create();
            }
            else
            {
                fileStream = new FileStream(logFile, FileMode.Append);
            }
            log = new StreamWriter(fileStream);

            if (_reason == "NoFile")
            {
                log.WriteLine(System.DateTime.UtcNow.ToString() + "- " + "no file exist in the incoming folder");
            }
            else if (_reason == "MultipleFile")
            {
                log.WriteLine(System.DateTime.UtcNow.ToString() + "- " + "more than 1 file present in incoming folder, place only 1 file at a time");
            }
            else if (_reason == "Success")
            {
                log.WriteLine(System.DateTime.UtcNow.ToString() + "- " + "Header appended and file moved to Archive. " + "incoming file - " + _sourceFileName + " target file - " + Path.GetFileName(_targetFile));
            }
            log.Close();
        }
    }
}

No comments:

Post a Comment