Объединение 2 .csv файлов общим столбцом

Я считаю, что это связано с тем, как выражение хранится и оценивается. Это определенно ошибка, но я не уверен, что это будет исправлено в будущем.

Я настроил разбиение на страницы в своем проекте с помощью универсального класса, который в конечном итоге создает выражение из типов значений. (Обратите внимание, что есть неиспользуемые свойства и поля, так как я оставил некоторый специфичный для домена код из логики)

public class Pagination<T>
{
    public IQueryable<T> Items;

    public int CurrentPageNumber { get; }

    public int PageSize { get; }

    public int StartPage { get; }

    public int TotalPages { get; set; }

    public Pagination(IQueryable<T> items, int pageNumber, int pageSize)
    {
        if (pageNumber <= 0)
        {
            throw new ArgumentOutOfRangeException(nameof(pageNumber));
        }

        if (pageSize <= 0)
        {
            throw new ArgumentOutOfRangeException(nameof(pageSize));
        }

        if (((decimal)DisplayPages % 2) == 0)
        {
            throw new ArgumentOutOfRangeException(nameof(DisplayPages), "Number of pages to render must be odd.");
        }

        Items = items;
        CurrentPageNumber = pageNumber;
        PageSize = pageSize;
        StartPage = 1;

        if (items.Any())
        {
            var rowCount = items.Count();
            TotalPages = (int)Math.Ceiling((decimal)rowCount / PageSize);
        }
        else
        {
            TotalPages = 1;
        }

    }

    public IQueryable<T> GetPageData()
    {
        return Items.Skip((CurrentPageNumber - 1) * PageSize).Take(PageSize) ?? new List<T>().AsQueryable();
    }

}

Тогда вы можете использовать его следующим образом:

var paginatedObjects = new Pagination<Type>(query, 1, 10)
{
    //Options if nessasary
};
paginatedObjects.GetPageData();
8
задан Drew Dormann 7 August 2018 в 00:27
поделиться

5 ответов

sort -t , -k index1 file1 > sorted1
sort -t , -k index2 file2 > sorted2
join -t , -1 index1 -2 index2 -a 1 -a 2 sorted1 sorted2
13
ответ дан 5 December 2019 в 06:39
поделиться

Вам нужно взглянуть на команду join в оболочке. Вам также нужно будет отсортировать данные и, возможно, потерять первые строки. Весь процесс потерпит неудачу, если какие-либо данные содержат запятые. Или вам нужно будет обработать данные с помощью CSV-чувствительного процесса, который вводит другой разделитель полей (возможно, control-A), который вы можете использовать для однозначного разделения полей.

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

2
ответ дан 5 December 2019 в 06:39
поделиться

Похоже, вы пытаетесь сделать это с помощью сценария оболочки, который обычно выполняется с помощью сервера SQL. Можно ли использовать SQL для этой задачи? Например, вы можете импортировать оба файла в mysql, затем создать объединение, а затем экспортировать его в CSV.

0
ответ дан 5 December 2019 в 06:39
поделиться

Вы можете взглянуть на мой проект FOSS CSVfix , который является потоковым редактором для манипулирования файлами CSV. Помимо других функций, он поддерживает объединения и не требует использования сценариев.

0
ответ дан 5 December 2019 в 06:39
поделиться

Это классическая проблема «реляционного объединения».

У вас есть несколько алгоритмов.

  • Вложенные циклы. Вы читаете из одного файла, чтобы выбрать «основную» запись. Вы читаете весь другой файл, находя все «подробные» записи, которые соответствуют основному. Это плохая идея.

  • Sort-Merge. Вы сортируете каждый файл во временную копию на основе общего ключа. Затем вы объединяете оба файла, читая из мастера, а затем читая все соответствующие строки из детали и записывая объединенные записи.

  • Lookup. Вы читаете один из файлов целиком в словарь в памяти, проиндексированный по ключевому полю. Это может быть сложно для подробного файла, где у вас будет несколько дочерних элементов на ключ. Затем вы читаете другой файл и ищите соответствующие записи в словаре.

Из них сортировка слиянием часто является самой быстрой. Это делается полностью с помощью команды unix sort .

Реализация поиска

import csv
import collections

index = collections.defaultdict(list)

file1= open( "someFile", "rb" )
rdr= csv.DictReader( file1 )
for row in rdr:
    index[row['MPID']].append( row )
file1.close()

file2= open( "anotherFile", "rb" )
rdr= csv.DictReader( file2 )
for row in rdr:
    print row, index[row['MPID']]
file2.close()
10
ответ дан 5 December 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: