Инвентаризация с помощью MATLAB (Низкоуровневый ввод / вывод)
Это то время, когда I/O сбивают меня с толку. В этом случае моя цель состоит в том, чтобы написать функцию, которая принимает в файл.txt инвентарных предметов и другой файл цен.txt и выводит общую стоимость пополнения запасов, а также в файле.txt с исходным запасом. данные и количество предметов, необходимых для пополнения. Например:
Inventory Data:
Buns #50 #63
Burgers #32 #55
Ketchup #6 #10
Hotdogs #4 #35
Mustard #7 #8
Примечание. Заголовок включен в файл.txt, и для его пополнения всегда будет пять элементов.
Мой выходной файл должен читаться как:
Inventory Data:
Buns #50 #63
Burgers #32 #55
Ketchup #6 #10
Hotdogs #4 #35
Mustard #7 #8
Restocking Data:
Buns #63 #13
Burgers #55 #23
Ketchup #10 #4
Hotdogs #35 #31
Mustard #8 #1
и мой общий итог должен быть 271, потому что
Prices:
Buns $2
Burgers $5
Ketchup $1
Hotdogs $4
Mustard $2
Амро был достаточно любезен, чтобы помочь мне понять, как вытащить линии, которые мне нужны, и как вычесть мои потребности из того, что у меня есть. Теперь моя последняя борьба (и последнее препятствие, которое мне нужно преодолеть, прежде чем я смогу лучше персонализировать проблему), - выяснить, как написать финал, который выводит исходные данные, а также данные пополнения запасов. Это должно выглядеть как тестовый пример
function[restock_cost] = inventory2(file, prices)
%// Reads both files
fh = fopen(file, 'rt');
C = textscan(fh, '%s', 'Delimiter','');
inventory = C{1};
fclose(fh);
Original = C{:};
Original = char(Original);
fh2 = fopen(prices, 'rt');
D = textscan(fh2, '%s', 'Delimiter','');
prices = D{1};
fclose(fh2);
%// Breaks up inventory data
inventory(1) = [];
x = regexp(inventory, '(\w+) #(\d+) #(\d+)', 'tokens', 'once');
x = vertcat(x{:});
itemName = x(:,1);
itemHave = str2double(x(:,2));
itemNeeded = str2double(x(:,3));
itemName = char(itemName);
%// Determines what needs to be restocked and how much is needed
Restock = itemNeeded - itemHave;
%// Breaks up price info
prices(1) = [];
x = regexp(prices, '(\w+) \$(\d+)', 'tokens', 'once');
x = vertcat(x{:});
item = x(:,1);
prices = str2double(x(:,2));
%// Finds the price
restock_cost = sum((Restock .* prices));
%// gets the business name
[name, ~] = strtok(file,'_');
%// Finds the size of Original(may help)
[r,c] = size(Original);
[r2,c2] = size(itemName);
[r3,c3] = size(itemNeeded);
%// Starts to write my output file.
fh2 = fopen([name '_RestockingData.txt'], 'wt');
fprintf(fh2, 'Inventory Data: \n');
fprintf(fh2, '\n');
for i = 2:r %// Don't want the header included
fprintf(fh2, Original(i,1:c));
fprintf(fh2,'\n');
end
fprintf(fh2, '\n');
fprintf(fh2,'\n');
fprintf(fh2, 'Restocking Data: \n');
fprintf(fh2,'\n');
for j = 1:r2
fprintf(fh2, itemName(j,1:c2));
fprintf(fh2,' #%d ', itemNeeded(j));
fprintf(fh2, '#%d', Restock(j));
fprintf(fh2,'\n');
end
end
Это близко, но мне нужно, чтобы вывести данные о пополнении запаса только с одним пробелом между именем элемента и номерами. Вместо этого это дает мне:
Inventory Data:
Chips #40 #100
Lettuce #80 #90
Cheese #22 #60
Tortillas #65 #100
Tomatoes #40 #70
Restocking Data:
Chips #100 #60
Lettuce #90 #10
Cheese #60 #38
Tortillas #100 #35
Tomatoes #70 #30
Я также попробовал это:
Restock_Data = {};
Restock_Data = [Restock_Data, {itemName, itemNeeded, Restock}];
Restocking = {Restock_Data};
Kill_Cell = [{Restocking}];
for j = 1:r2
fprintf(fh2, Restock_Data(j));
fprintf(fh2,'\n');
end
Мне нужно преобразовать мою ячейку в какую-то другую форму, но ее индексация (как вы можете видеть в Kill_Cell) не работает. конец
Это должно быть все. Вот заметки, данные мне на всякий случай:
Notes:
- All inventory numbers will have a # in front of them
- All the prices will have a $ in front of them and will always be a
full dollar amount.
- When creating the new output every item should be seperated by a space
Ex. 'Chips #5 #2'
- There will always be 5 items to stock.
- If your output file is not EXACTLY the same as the solution txt file,
then you will receive 0 credit for it.
1 ответ
Вот один из способов использовать текстовое сканирование для чтения файла инвентаризации:
fid = fopen('inventory.txt', 'rt');
C = textscan(fid, '%s #%d #%d', 'HeaderLines',1, 'CollectOutput',true);
fclose(fid);
Данные проанализированы:
>> C
C =
{5x1 cell} [5x2 int32]
>> C{1}
ans =
'Buns'
'Burgers'
'Ketchup'
'Hotdogs'
'Mustard'
>> C{2}
ans =
50 63
32 55
6 10
4 35
7 8
Вы также можете прочитать файл просто как массив строк строк (я использовал это в своих предыдущих ответах на ваши вопросы):
fid = fopen('inventory.txt', 'rt');
C = textscan(fid, '%s', 'Delimiter','');
C = C{1};
fclose(fid);
Результат в этом случае:
>> C
C =
'Inventory Data:'
'Buns #50 #63'
'Burgers #32 #55'
'Ketchup #6 #10'
'Hotdogs #4 #35'
'Mustard #7 #8'
РЕДАКТИРОВАТЬ:
Как я уже показал, сначала мы читаем файлы в виде массива строк (строк текста):
% read both files
fid = fopen('inventory.txt', 'rt');
C = textscan(fid, '%s', 'Delimiter','');
inventory = C{1};
fclose(fid);
fid = fopen('prices.txt', 'rt');
C = textscan(fid, '%s', 'Delimiter','');
prices = C{1};
fclose(fid);
Далее мы используем регулярные выражения для сопоставления шаблонов в тексте:
% parse inventory data
inventory(1) = [];
x = regexp(inventory, '(\w+) #(\d+) #(\d+)', 'tokens', 'once');
x = vertcat(x{:});
itemName = x(:,1)
itemHave = str2double(x(:,2))
itemNeeded = str2double(x(:,3))
% parse prices data
prices(1) = [];
x = regexp(prices, '(\w+) \$(\d+)', 'tokens', 'once');
x = vertcat(x{:});
item = x(:,1)
price = str2double(x(:,2))
Наконец, вы можете применить свою логику для пополнения запасов и распечатать требуемый результат...