using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Microsoft.VisualBasic.FileIO;
namespace CMCIC_CSV_to_PI
static void Main(string[] args)
Console.WriteLine("Must supply input & output file");
System.Environment.Exit(-1);
using (var output = new StreamWriter(args[1]))
using (var input = new TextFieldParser(args[0]))
input.SetDelimiters(",");
input.HasFieldsEnclosedInQuotes = true;
output.WriteLine("Type,Name,ISIN,Strat,Amount");
Row row = new Row(input);
if (stratBond != row.Strat)
if (row.Type == "ConvertibleBond")
if (row.Name.StartsWith("BON") && row.Type == "ConvertibleBond")
if (row.Name.StartsWith("IndexSwap"))
if (isinBond2 == "" && isinBond!="")
else if (isinBond2 != "" && isinBond !="")
if (row.Name.Substring(row.Name.Length - 2) == isinBond.Substring(isinBond.Length - 2))
else if (row.Name.Substring(row.Name.Length - 2) == isinBond2.Substring(isinBond2.Length - 2))
if (row.Type == "IRSwap")
List<string> tableau = new List<string>();
while (row.Type == "IRSwap")
tableau.Add(row.Amount.ToString());
string[] split = row.Isin.Split('/');
Row row1 = new Row(input);
for (int i = 5; i < tableau.Count - 1; i += 7)
for (int k = 7; k < tableau.Count - i; k += 7)
if (tableau[i] == tableau[i + k + 1] && tableau[i+1] == tableau[i+k])
double Montant = Convert.ToDouble(tableau[i - 1]);
Montant += Double.Parse(tableau[i + k - 1]);
tableau[i - 1] = Montant.ToString();
tableau.RemoveRange(i + k - 5, 7);
for (int i = 0; i < tableau.Count - 5; i += 7)
output.WriteLine("{0},{1},{2},{3},{4}", tableau[i], tableau[i + 1], tableau[i + 2], tableau[i + 3], tableau[i + 4]);
if (row.Type == "EquitySwap")
if (!eqsRow.combineAmounts(row))
Console.WriteLine("Failed " + e);
System.Environment.Exit(-1);
public Row(TextFieldParser input)
var fields = input.ReadFields();
type = getType(fields[3]);
amount = Double.Parse(fields[8]);
else if (fields[2] == "E")
amount = -Double.Parse(fields[8]);
throw new ApplicationException("Unknown Sens flag " + fields[2] + " for " + name);
amount = Double.Parse(fields[8]);
else if (type == "BondFutures" || type == "IRFutures")
StringBuilder sbFut = new StringBuilder(fields[3]);
sbFut.Replace(" ", null);
string sbFutString = sbFut.ToString();
static private Regex matchAssetSwap = new Regex("^BON.*BO[0-9]+$");
private static string getType(string name)
if (name.StartsWith("BON"))
if (false && matchAssetSwap.IsMatch(name))
return "ConvertibleBond";
if (name.StartsWith("FUT FUTURE TNOTE") || name.StartsWith("FUT FUTURE EURO") || name.StartsWith("FUT FUTURE GILT") || name.StartsWith("FUT FUTURE SWISS 10Y"))
if (name.StartsWith("FUT FUTURE") && name.Contains("3M"))
if (name.StartsWith("FUT FUTURE"))
if (name.StartsWith("Swap"))
if (name.StartsWith("EQU") || name.StartsWith("PTFSWAP"))
if (name.StartsWith("EQS"))
if (name.StartsWith("IndexSwap"))
return "ConvertibleBond";
public bool combineAmounts(Row r)
if (type == r.type && strat == r.strat && isin == r.isin)
public void writeRow(StreamWriter output)
output.WriteLine("{0},{1},{2},{3},{4}", type, name, isin, strat, amount);