Podłącze się do tematu bo też mam problem z odzworowaniem znaku końca linii w wyrażeniu regularnym.
w pliku o formacie m.in. takim:
1 fgj23mdjvi4da Nazwa Towaru w systemie ERP 65 0 00% 65 100 szt 6500
Nazwa Rozszerzona 1
2 dmajb93nakeib Normalna Nazwa 12 0 00% 12 20 szt 240
3 3ngkanflow96n Dziwna 328x, nazwa 76 0 00% 76 30 szt 2280
4 gmalburkaje92 Wyrob z grupy o stalej dlugosci nazwy 385 0 00% 385 20 szt 7
Nazwa rozszerzona 2
5 fjka73mpoa825 Wyrob-o-takiej-nazwie 5 0 00% 5 5 szt 25
6 dk239gmajkwo3 Jakis wyrob 6 5 0 00% 5 1 szt 5
szukam linii pozycji zamówienia takim wyrażeniem:
string wzorzecTestowy = @"(?<Lp>\d{1,3})\t(?<Index>.{10,25})\t(?<NazwaH>.+?)\t(\d{1,5})\t(\d+?)\t(\d{2}%)\t(\d+)\t(?<Ilosc>\d+)\t(?<jm>.{1,3})\t(\d+)(?<NazwaS>.*?$)";
ale w tej formie wszystkie grupy są rozpoznawane prawidłowo oprócz grupy NazwaS, tu wartość sczytana wychodzi mi string = "";
Dla takiego wyrażenia:
string wzorzecTestowy = @"(?<Lp>\d{1,3})\t(?<Index>.{10,25})\t(?<NazwaH>.+?)\t(\d{1,5})\t(\d+?)\t(\d{2}%)\t(\d+)\t(?<Ilosc>\d+)\t(?<jm>.{1,3})\t(\d+).*?$(?<NazwaS>).+?";
Zwracany jest pusty MatchCollection w metodzie OdszukajWDokumencieZbior(string wzorzecRegex).
Tworzenie wyrażenia mam zrobione tak:
private MatchCollection OdszukajWDokumencieZbior(string wzorzecRegex)
{
if (!String.IsNullOrEmpty(ZawartoscOdczytanegoPliku))
{
return Regex.Matches(zawartoscOdczytanegoPliku, wzorzecRegex, RegexOptions.Multiline);
}
}
public void UstawListePozycjiZamowienia()
{
MatchCollection wynikRegex = OdszukajWDokumencieZbior(wzorzecTestowy);
if (wynikRegex != null && wynikRegex.Count != 0)
{
for (int i = 0; i < wynikRegex.Count; i++)
{
PozycjaZamowienia nowa = new PozycjaZamowienia();
nowa.NrPozycji = Int32.Parse(wynikRegex[i].Groups["Lp"].Value);
nowa.IndexERP = wynikRegex[i].Groups["Index"].Value;
nowa.NazwaHandlowa = wynikRegex[i].Groups["NazwaH"].Value;
nowa.Ilosc = Int32.Parse(wynikRegex[i].Groups["Ilosc"].Value);
nowa.Jm = wynikRegex[i].Groups["jm"].Value;
nowa.NazwaSprzedazowa = wynikRegex[i].Groups["NazwaS"].Value.Trim();
zo.DodajPozycjeDoZamowienia(nowa);
}
}
}
Nie wiem jak prawidłowo odczytać z pliku tą nazwę rozszerzoną pozycji zamowienia, ktora jest w kolejnej linii za linią pozycji zamowienia.
Nie wiem jak prawidlowo zdefiniować wyrażenie regularne określające to, że spodziewany ciąg znaków jest po__ jednym znaku__ końca linii i po powrocie karetki po określonej ilości tabulacji.
Próbowałem wszyć w wyrażenie regularne znaki \n\r ale wtedy metoda private MatchCollection OdszukajWDokumencieZbior(string wzorzecRegex), zwraca pusty obiekt MatchCollection.
EDIT:
Dla takiego RegEx:
string wzorzecTestowy = @"(?<Lp>\d{1,3})\t(?<Index>.{10,25})\t(?<NazwaH>.+?)\t(\d{1,5})\t(\d+?)\t(\d{2}%)\t(\d+)\t(?<Ilosc>\d+)\t(?<jm>.{1,3})\t(\d+)\s*?$\s(?<NazwaS>.+?)";
grupa NazwaS również zwraca "".