jinesh sam Ответов: 2

Как передать определенную часть csv-файла


Привет Друзья,

У меня есть csv-файл, и мне нужно разобрать его для определенной части. Поскольку мой csv-файл не имеет правильной структуры, его трудно прочитать в память и идентифицировать строки и столбцы.

Мое требование заключается в том, что здесь даны две учетные записи, которые должны быть проанализированы на основе структуры класса


ASSTROLLUPSTRT
TOTALACCTS ,  Total Accounts : 2
ACCTHDR , Account Details
ACCTHDR , Key Account ID, Account Type, Value, Portfolio Type, Portfolio ID, Owner ID
ACCTDTLS ,  2002-01-20-12.04.20.445297, RothIRA, 6280496.23, TaxExemptIRA, 1, 2423
ACCTALLOHDR, Account Allocations
ACCTALLOHDR, Key Account ID, Type , AssetClass, Value
ACCTALLODTLS ,  2002-01-20-12.04.20.445297, Allocation, E, 0.11
ACCTALLODTLS ,  2002-01-20-12.04.20.445297, Cost Basis, E, 0
ACCTALLODTLS ,  2002-01-20-12.04.20.445297, Allocation, EA, 0.11
ACCTALLODTLS ,  2002-01-20-12.04.20.445297, Cost Basis, EA, 0
ACCTALLODTLS ,  2002-01-20-12.04.20.445297, Allocation, A, 2.92
ACCTALLODTLS ,  2002-01-20-12.04.20.445297, Cost Basis, A, 123328.9
ACCTALLODTLS ,  2002-01-20-12.04.20.445297, Allocation, AH, 2.92
ACCTALLODTLS ,  2002-01-20-12.04.20.445297, Cost Basis, AH, 123328.9
ACCTALLODTLS ,  2002-01-20-12.04.20.445297, Allocation, O, 56.72
ACCTALLODTLS ,  2002-01-20-12.04.20.445297, Cost Basis, O, 0
ACCTALLODTLS ,  2002-01-20-12.04.20.445297, Allocation, OO, 56.72
ACCTALLODTLS ,  2002-01-20-12.04.20.445297, Cost Basis, OO, 0
ACCTALLODTLS ,  2002-01-20-12.04.20.445297, Allocation, L, 40.25
ACCTALLODTLS ,  2002-01-20-12.04.20.445297, Cost Basis, L, 2528022.3
ACCTALLODTLS ,  2002-01-20-12.04.20.445297, Allocation, LC, 40.25
ACCTALLODTLS ,  2002-01-20-12.04.20.445297, Cost Basis, LC, 2528022.3
ACCTDTLS ,  2016-09-28 13:01:20:9473, Taxable, 0, Taxable, 2, 2423
ACCTALLOHDR, Account Allocations
ACCTALLOHDR, Key Account ID, Type , AssetClass, Value
ACCTALLODTLS ,  2016-09-28 13:01:20:9473, Allocation, LC, 100
ACCTALLODTLS ,  2016-09-28 13:01:20:9473, Cost Basis, LC, 0
ACCTALLODTLS ,  2016-09-28 13:01:20:9473, Allocation, L, 100
ACCTALLODTLS ,  2016-09-28 13:01:20:9473, Cost Basis, L, 0


Что я уже пробовал:

Ниже приведен класс, который я определил, посмотрев на csv-файл. для удобства синтаксического анализа, если требуются изменения, мы можем изменить структуру класса.
Пожалуйста, помогите мне достичь этого..Пожалуйста, пролейте немного света, как действовать дальше
    public class CSVparsing
{
    public List AccountDetails<Item> { get; set; } // //less than and greater symbol is not working while posting the question
}

public class AccountDetails
{
    public string  KeyAccountID { get; set; }
    public string  AccountType { get; set; }
    public double Value { get; set; }
    public string  PortfolioType { get; set; }
    public double EarningsRate { get; set; }
    public int  PortfolioID { get; set; }
    public int  OwnerID { get; set; }
    public Allocation AllocDetails { get; set; }
}
public class Allocation
{
    public string AssetClassCode { get; set; }
    public double Amount { get; set; } //Allocation Value
    public double CostBasis { get; set; } // Cost Basis Value
}

[no name]

Как вы можете достичь чего? Написание некоторого кода было бы хорошим началом.

jinesh sam

пожалуйста, предложите несколько советов для начала. Какой метод будет эффективен ?

#realJSOP

Чтобы включить < и > в сообщение здесь, вы должны использовать стандартную html-нотацию & lt; и & gt;

Я пошел дальше и исправил твои" то, что я пробовал".

jinesh sam

@John, одно сомнение, если < находится внутри тега pre= " C#", почему нам нужно идти на lt; раньше я не сталкивался ни с какими подобными проблемами. при постановке вопросов

2 Ответов

Рейтинг:
1

#realJSOP

Ну, первое, что вам нужно сделать, это определить шаблон(Ы) и код для этого. После беглого взгляда картина выглядит так:

<br />
ASSTROLLUPSTRT<br />
  ACCTHDR [section name]<br />
    ACCTHDR [column names]<br />
      ACCTDTLS, Detail data...<br />
    ACCTALLOHDR [subheader name]<br />
      ACCTALLOHDR[column names]<br />
        ACCTALLODTLS, Detail data...<br />
        ACCTALLODTLS, Detail data...<br />
        ACCTALLODTLS, Detail data...<br />


После того как вы установили шаблоны, напишите код для их поддержки. К сожалению, это не CSV-файл в соответствии со строгим определением CSV-файла (все строки имеют одинаковое количество столбцов). Это больше похоже на XML-файл без XML-оформления. Название раздела неудобно, но не является существенным ментальным препятствием. Идите вперед и кодируйте.


Maciej Los

Хорошее предложение. А5!

Рейтинг:
0

jinesh sam

Сам нашел решение. Пожалуйста, кто-нибудь предложит какой-нибудь простой или легкий способ

 class Program
    {
        static void Main(string[] args)
        {
            var lines = File.ReadAllLines(@"Mycsvfile.csv").Select(x => x.Split(',')).ToList();
            List<accountdetails> lstAccountDetails = new List<accountdetails>();
            for (int i = 0; i < lines.Count; i++)
            {
                if (lines[i][0].Trim() == "ACCTDTLS")
                {
                    AccountDetails ad = new AccountDetails();
                    if (lines[i].Count() > 6)
                    {
                        ad.KeyAccountID = lines[i][1];
                        ad.AccountType = lines[i][2];
                        ad.Value = Convert.ToDouble(lines[i][3]);
                        ad.PortfolioType = lines[i][4];
                        ad.PortfolioID = Convert.ToInt32(lines[i][5]);
                        ad.OwnerID = Convert.ToInt32(lines[i][6]);
                    }
                    i = i + 3;
                    List<allocation> lstallocation = new List<allocation>();
                    for (int j = i; j < i + 2; j++)
                    {
                        Allocation aloc = new Allocation();
                        if (j < lines.Count)
                        {
                            aloc.AssetClassCode = lines[j][3];
                            if (lines[j][0].Trim() == "ACCTALLODTLS")
                            {
                                aloc.Amount = Convert.ToDouble(lines[j][4].Trim());
                                aloc.CostBasis = Convert.ToDouble(lines[j + 1][4].Trim());
                                j = j + 1;
                                lstallocation.Add(aloc);
                                i = j + 1;
                            }
                            else
                            {
                                i = i - 1;
                                break;
                            }                           
                        }
                        else
                        {
                            break;
                        }                      
                    }
                    ad.AllocDetails = lstallocation;
                    lstAccountDetails.Add(ad);
                }
            }
            Console.ReadLine();
        }
    }
</allocation></allocation></accountdetails></accountdetails>