You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
224 lines
7.3 KiB
224 lines
7.3 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.IO;
|
|
using Swift.DAL.SwiftDAL;
|
|
|
|
namespace Swift.DAL.BL.Helper
|
|
{
|
|
public class XmlGenerator
|
|
{
|
|
public string FilePath{get;set;}
|
|
public List<FieldName> FieldList { get; set; }
|
|
public bool FirstLineIsHeader { get; set; }
|
|
public bool CheckFirstLineHeader { get; set; }
|
|
public bool UseHearderAsColumn { get; set; }
|
|
public string RowSeperator { get; set; }
|
|
public string ColSeperator { get; set; }
|
|
public bool IgnoreInvalidRow { get; set; }
|
|
public int TotalRecords { get; set; }
|
|
public int InvalidRecords { get; set; }
|
|
public DbResult Dr { get; set; }
|
|
|
|
private DbResult CheckHeader(string fileName)
|
|
{
|
|
var res = new DbResult();
|
|
res.SetError("0", "Success", "");
|
|
var streamReader = new StreamReader(fileName);
|
|
if (streamReader.EndOfStream)
|
|
{
|
|
res.SetError("1", "Invalid file. Please check the data in the file", "");
|
|
return res;
|
|
}
|
|
var firstLine = streamReader.ReadLine();
|
|
if(firstLine.Length < 2)
|
|
{
|
|
res.SetError("1", "Invalid data found. Please check the first line", "");
|
|
return res;
|
|
}
|
|
if(IsNumeric(firstLine.Substring(0,2)))
|
|
{
|
|
res.SetError("1", "Header should be included. Please include header in the file.", "");
|
|
return res;
|
|
}
|
|
return res;
|
|
}
|
|
|
|
public static Boolean IsNumeric(string stringToTest)
|
|
{
|
|
int result;
|
|
return int.TryParse(stringToTest, out result);
|
|
}
|
|
|
|
public string GenerateXML()
|
|
{
|
|
var dr = new DbResult();
|
|
var errorRecordNumber = "";
|
|
if (!UseHearderAsColumn && FieldList.Count==0)
|
|
{
|
|
if (FirstLineIsHeader)
|
|
{
|
|
UseHearderAsColumn = true;
|
|
}
|
|
}
|
|
|
|
var sb = new StringBuilder();
|
|
|
|
var contents = "";
|
|
if (UseHearderAsColumn && FirstLineIsHeader)
|
|
{
|
|
contents = ReadFileContent(FilePath, false);
|
|
}
|
|
else
|
|
{
|
|
if (CheckFirstLineHeader)
|
|
{
|
|
var res = CheckHeader(FilePath);
|
|
if (res.ErrorCode != "0")
|
|
{
|
|
Dr = res;
|
|
return "";
|
|
}
|
|
contents = ReadFileContent(FilePath, true);
|
|
}
|
|
else
|
|
{
|
|
contents = ReadFileContent(FilePath, false);
|
|
}
|
|
}
|
|
|
|
var rowSeperator = new[] { RowSeperator };
|
|
var rows = contents.Split(rowSeperator, StringSplitOptions.None);
|
|
var colSeperator = new[] { ColSeperator };
|
|
int start = UseHearderAsColumn ? 1 : 0;
|
|
if (rows.Length > 0 && (UseHearderAsColumn || FieldList.Count==0))
|
|
{
|
|
var cols = rows[0].Split(colSeperator, StringSplitOptions.None);
|
|
if (UseHearderAsColumn)
|
|
{
|
|
var list = new List<FieldName>();
|
|
var i = 0;
|
|
foreach (var col in cols)
|
|
{
|
|
list.Add(new FieldName(i++, col));
|
|
}
|
|
|
|
FieldList = list;
|
|
}
|
|
else
|
|
{
|
|
var list = new List<FieldName>();
|
|
var i = 0;
|
|
foreach (var col in cols)
|
|
{
|
|
list.Add(new FieldName(i++, "field" + i.ToString()));
|
|
}
|
|
|
|
FieldList = list;
|
|
}
|
|
}
|
|
|
|
var end = rows.Length;
|
|
TotalRecords = end - start;
|
|
var invalidRecords = 0;
|
|
|
|
sb.Append("<root>");
|
|
for (var i = start; i < end; i++)
|
|
{
|
|
var cols = rows[i].Split(colSeperator, StringSplitOptions.None);
|
|
var colLengh = cols.Length;
|
|
|
|
if (colLengh == FieldList.Count)
|
|
{
|
|
sb.Append("<row");
|
|
foreach (var fld in FieldList)
|
|
{
|
|
sb.Append(" " + fld.Name.ToLower().Replace(" ", "_") + "=\"" + cols[fld.Index] + "\"");
|
|
}
|
|
sb.Append(" has_error=\"N\"");
|
|
sb.Append("/>");
|
|
}
|
|
else
|
|
{
|
|
if (IgnoreInvalidRow)
|
|
{
|
|
sb.Append("<row");
|
|
foreach (var fld in FieldList)
|
|
{
|
|
if (fld.Index <= colLengh)
|
|
{
|
|
sb.Append(" " + fld.Name.ToLower().Replace(" ", "_") + "=\"" + cols[fld.Index] + "\"");
|
|
}
|
|
else
|
|
{
|
|
sb.Append(" " + fld.Name.ToLower().Replace(" ", "_") + "=\"\"");
|
|
}
|
|
}
|
|
sb.Append(" has_error=\"Y\"");
|
|
sb.Append("/>");
|
|
errorRecordNumber += ", " + i.ToString();
|
|
invalidRecords++;
|
|
}
|
|
else
|
|
{
|
|
dr.Msg = "Invalid data found. Please check data at row: " + i.ToString();
|
|
dr.ErrorCode = "1";
|
|
Dr = dr;
|
|
return "";
|
|
}
|
|
}
|
|
}
|
|
|
|
sb.Append("</root>");
|
|
if (errorRecordNumber != "")
|
|
{
|
|
dr.Msg = "Error records found at row(s) : " + errorRecordNumber;
|
|
dr.ErrorCode = "101";
|
|
}
|
|
else
|
|
{
|
|
dr.Msg = "xml generated successfully.";
|
|
dr.ErrorCode = "0";
|
|
}
|
|
|
|
InvalidRecords = invalidRecords;
|
|
Dr = dr;
|
|
return sb.ToString();
|
|
}
|
|
|
|
|
|
protected string ReadFileContent(string fileName)
|
|
{
|
|
return ReadFileContent(fileName, false);
|
|
}
|
|
|
|
protected string ReadFileContent(string fileName, bool ignoreFirstLine)
|
|
{
|
|
var streamReader = new StreamReader(fileName);
|
|
if (streamReader.EndOfStream)
|
|
return "";
|
|
if (ignoreFirstLine)
|
|
{
|
|
streamReader.ReadLine();
|
|
if (streamReader.EndOfStream)
|
|
return "";
|
|
}
|
|
var contents = streamReader.ReadToEnd();
|
|
contents = contents.TrimEnd('\r', '\n');
|
|
streamReader.Close();
|
|
streamReader.Dispose();
|
|
return contents;
|
|
}
|
|
}
|
|
public class FieldName
|
|
{
|
|
public int Index { get; set; }
|
|
public string Name { get; set; }
|
|
|
|
public FieldName(int index, string name)
|
|
{
|
|
Index = index;
|
|
Name = name;
|
|
}
|
|
}
|
|
}
|