@yossiz כתב בקוד C# לחילוץ טקסט מקבצי וורד:
עוד הערה קטנה: אני מבין שבצורך שלך זה לא כל כך רלוונטי, אבל לצרכים אחרים היה כדאי לקבל את מספרי ההערות
הוספתי כעת
פיסקאות ממוספרות הצלחתי לסמן רק עם * ולא עם המספרים
הפורום כעת לקריאה בלבד, לקריאה נוספת.
@yossiz כתב בקוד C# לחילוץ טקסט מקבצי וורד:
עוד הערה קטנה: אני מבין שבצורך שלך זה לא כל כך רלוונטי, אבל לצרכים אחרים היה כדאי לקבל את מספרי ההערות
הוספתי כעת
פיסקאות ממוספרות הצלחתי לסמן רק עם * ולא עם המספרים
@yossiz כתב בקוד C# לחילוץ טקסט מקבצי וורד:
עוד הערה קטנה: אני מבין שבצורך שלך זה לא כל כך רלוונטי, אבל לצרכים אחרים היה כדאי לקבל את מספרי ההערות
אבדוק את זה תודה.
תכלס לבינתיים
בשיטה השניה מקבלים הכל כולל פיסקאות ממוספרות
מי שדחוף לו כל זה יכול להשתמש רק בשיטה השניה
החסרונות בשיטה השניה הם:
א. איטיות
ב. צריך שיהיה וורד מותקן במחשב (תאמינו או לא אבל יש אנשים שאין להם וורד במחשב)
הערה חשובה:
לאחר חקירת הנושא גיליתי שצריך לעבוד עם אחוזים ולא כמו שעשיתי
עיין כאן להסבר מפורט
https://brianlagunas.com/does-reporting-progress-with-task-run-freeze-your-wpf-ui/
עריכה:
בדיקות שעשיתי יוצא שבעל הכתבה איננו צודק לא היה שום שיפור באחוזים לעומת מה שאני עשיתי
מה שכן מצאתי ששימוש ב- אפשרות של -Background ב-Dispathcer מועיל קימעא
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
}), DispatcherPriority.Background);
@yossiz כתב בבאיזה תוכנת אינדקס גוגל משתמשים?:
עיין כתבה זו על האתגרים המיוחדים בעברית
הכתבה הנ"ל לבסוף הובילה לפרוייקט יפה מאוד שקורים לו HEBMORPH.
ברצוני לכתוב כמה השגות שהיו לי על פרוייקט זה - בעצם כמנוע חיפוש כללי הוא באמת משדרג את החיפוש בהמון. חשוב לציין שהמילון שהוא משתמש בו נמצא בשימוש על ידי מנוע החיפוש של גוגל ועוד כמה מנועי חיפוש מפורסמים והעקרונות שלו ה עקרונות חזקים ומנוסים.
יחד עם זאת כשמדברים על HEBMORPH ודומיו, חשוב להבין שמדובר בפרויקט שמנסה לבנות חיפוש חכם בעברית. אבל האם חיפוש חכם מתאים תמיד לצרכי המשתמש? אני לא בטוח. ניקח לדוגמה את הסרת ה-stopwords (מילים כמו "כי"). בחיפוש כללי, זה מייעל את האינדוקס והחיפוש, אבל בחיפוש תורני, לעיתים עדיף לחפש את המשפט כולל "כי", במיוחד בחיפוש פסוקים. בנוסף, הפרויקט HEBMORPH מבוסס על מילון עברי כללי, מה שמפחית את ביצועיו בחיפוש תורני.
עריכה: כל זה נכון אם יש לך אמפמינציה אישית של lucene אבל אם אתה משתמש בו כמות שהוא אתה רק מרוויח אם אתה משתמש ב-HEBMORPH למה? כי Lecene הינו מנוע חיפוש ולשכך הוא בנוי על אלגוריתמים שמחשבים רלוונטיות וממילא כל כלי שמתעל את הרלוונטיות מתעל את המנוע.
הנקודה היא שקשה לייצר מנוע חיפוש כוללני כי הצרכים משתנים ממקרה למקרה.
אישית בתוכנות שלי ב-C# אני לא משתמש ב- HEBMORPH מחמת סיבה צדדית, כי הוא לא מעודכן לגרסה האחרונה של Lucene, מה שמקשה מאוד על השימוש בו. אציין גם שיש חלקים בקוד שהם ממש לא אינטואיטיביים, כך שהתייאשתי לבינתיים מלנסות להתאים את HEBMORPH לגרסה הנוכחית. זה יצריך ממני ללמוד לעומק את הגרסה הישנה ואז לתרגם אותה לחדשה, ואין לי את הזמן או את העצבים לזה.
מישהו יכול להדריך אותי איך ליצור שירות ברקע ב-C# עבור פעולת אינדוקס בתוכנת FullTextSearch? האינדוקס יכול לקחת כמה שעות טובות, ואני רוצה שהוא ימשיך לפעול גם אם התוכנה נסגרת או שהמשתמש מפעיל את המחשב מחדש.
כמו"כ איך אני מתקשר בין התוכנה שלי לשירות? אני רוצה להעביר לשירות מידע על המסמכים שצריך לאנדקס, ולקבל מידע על התקדמות האינדוקס שישוקף בתוכנה
@dovid כתב בספריית החיפוש meilisearch ב-בC#:
וזה הגיוני במידה והתוכנה שלך היא עם צד שרת.
כלומר לא הגיוני בתוכנה שלי תורת אמת בוורד?
מישהו מכיר את ספריית החיפוש meilisearch
האם מישהו יכול להמליץ לי עליה.
כמו:כ הייתי שמח לדעת האם היא מתאימה לתוכנה שלי תורת אמת בוורד
איך להסיר ניקוד וטעמים מטקסט בc#
מצאתי שני דרכים אשמח לקבל המלצות איזה עדיף ולמה.
public static string RemoveDiactricts(string input)
{
return Regex.Replace(input, @"\p{M}", "");
}
דרך ה-NuGet התקינו את ספריית Diactricts

לאחמ"כ תוכלו להתשמש עם ה-class דלהלן
public class HebrewDiacriticsMapping : IAccentMapping
{
private readonly Dictionary<char, MappingReplacement> mappings;
public HebrewDiacriticsMapping()
{
mappings = CreateMappings();
}
public IDictionary<char, MappingReplacement> Mapping => mappings;
private Dictionary<char, MappingReplacement> CreateMappings()
{
var mappings = new Dictionary<char, MappingReplacement>();
// Remove all Hebrew diacritics by mapping them to an empty string
// Diacritics in Hebrew range from U+0591 to U+05BD, U+05C1, U+05C2, U+05C4, U+05C5
// U+0591 - U+05AF (excluding U+05BE - U+05C0, which are vowels and other symbols)
// U+05B0 - U+05BD, U+05C1, U+05C2, U+05C4, U+05C5 (including additional diacritics)
for (int i = 0x0591; i <= 0x05AF; i++)
{
char diacriticChar = (char)i;
mappings[diacriticChar] = new MappingReplacement();
}
for (int i = 0x05B0; i <= 0x05BD; i++)
{
char diacriticChar = (char)i;
mappings[diacriticChar] = new MappingReplacement();
}
mappings['\u05C1'] = new MappingReplacement();
mappings['\u05C2'] = new MappingReplacement();
mappings['\u05C4'] = new MappingReplacement();
mappings['\u05C5'] = new MappingReplacement();
return mappings;
}
}
public static class HebrewDiacriticsRemover
{
private static readonly DiacriticsMapper mapper = new DiacriticsMapper(new HebrewDiacriticsMapping());
public static string RemoveHebrewDiacritics(this string input)
{
return mapper.RemoveDiacritics(input);
}
}
כלומר לאפוקי אם אם משתמשים ב-
net FrameWork.
שמה זה תמיד מראה את המיושן
רק ב-
NET Core 3.1 ומעלה זה מראה את העדכני
יש לכם הערות? אנא כתבו אותם לתועלת כולם!
הערה: אישית אני ראיתי תועלת גדולה ב-mvvm, למרות שביישום של commands לא כל כך ראיתי תועלת בפרוייקטים שלי כי לרוב זה לא היה נצרך ורק הפך את הקוד למסורבל, בכל אופן הדוגמא דלהלן כוללת אותם לצורך ההדגמה ואפשר לראות כיצד הם 'מחליקים' את פעולת התוכנה, כמו"כ הוספתי קיצורי מקשים דרך ה-commands מה שמדגים את השימושיות שלהם.
עיין כאן להסבר על המושג MVVM:
להרחבה על הנושא עיין כאן
היה לי צורך להדגים את המודל mvvm עבור ידיד אז יצרתי את הפרוייקט דלהלן על בסיס כתבה זו (הפרוייקט רחוק מלהיות מושלם אבל הוא מספיק בשביל הדגמה לדעתי):
התוכנה מיישמת מחשבון (כלשהו) שיניתי קצת מהכתבה לצורך ההדגמה.
<Window x:Class="WpfTestProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfTestProject"
mc:Ignorable="d"
Background="WhiteSmoke"
SizeToContent="WidthAndHeight"
FocusManager.FocusedElement="{Binding ElementName=FirstValueTextBox}">
<Window.DataContext>
<local:CalculatorViewModel/>
</Window.DataContext>
<Window.InputBindings>
<KeyBinding Key="A" Modifiers="Control" Command="{Binding AddCommand}"/>
<KeyBinding Key="S" Modifiers="Control" Command="{Binding SubTractCommand}"/>
<KeyBinding Key="T" Modifiers="Control" Command="{Binding TimesCommand}"/>
<KeyBinding Key="D" Modifiers="Control" Command="{Binding DivideCommand}"/>
<KeyBinding Key="P" Modifiers="Control" Command="{Binding PercentCommand}"/>
</Window.InputBindings>
<Window.Resources>
<Style TargetType="TextBox">
<Setter Property="Margin" Value="5"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="BorderBrush" Value="LightGray"/>
</Style>
<Style TargetType="TextBlock">
<Setter Property="Margin" Value="5"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
<Style TargetType="Label">
<Setter Property="Margin" Value="5"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="BorderBrush" Value="LightGray"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Background" Value="White"/>
</Style>
<Style TargetType="Button">
<Setter Property="Margin" Value="5"/>
<Setter Property="Background" Value="{x:Null}"/>
<Setter Property="BorderBrush" Value="LightGray"/>
<Setter Property="Height" Value="38"/>
<Setter Property="Width" Value="{Binding Path=Height, RelativeSource={RelativeSource Self}}"/>
</Style>
</Window.Resources>
<StackPanel>
<TextBlock Text="Calculator" HorizontalAlignment="Center"
FontSize="34" Foreground="BlueViolet"/>
<Grid Margin="5,10,5,5" KeyboardNavigation.TabNavigation="Cycle">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBox x:Name="FirstValueTextBox" Grid.Column="0" Text="{Binding FirstValue}" />
<TextBlock Text="{Binding MathMethod}" Grid.Column="1"/>
<TextBox x:Name="SecondValueTextBox" Grid.Column="2" Text="{Binding SecondValue}"/>
<TextBlock Text="=" Grid.Column="3" VerticalAlignment="Center" Margin="5"/>
<Label Grid.Column="4" Margin="5"
Content="{Binding ResultValue, BindsDirectlyToSource=True}"/>
</Grid>
<StackPanel Orientation="Horizontal" Margin="5">
<Button Content="+" Command="{Binding AddCommand}"/>
<Button Content="-" Command="{Binding SubTractCommand}"/>
<Button Content="*" Command="{Binding TimesCommand}"/>
<Button Content="/" Command="{Binding DivideCommand}"/>
<Button Content="%" Command="{Binding PercentCommand}"/>
</StackPanel>
</StackPanel>
</Window>
using System;
using System.Windows.Input;
namespace WpfTestProject
{
public abstract class ICommandBase : ICommand
{
public event EventHandler CanExecuteChanged;
public virtual bool CanExecute(object parameter)
{
return true;
}
public abstract void Execute(object parameter);
protected void OnCanExecuteChanged()
{
CanExecuteChanged?.Invoke(this, new EventArgs());
}
}
public class RelayCommand : ICommandBase
{
private Action commandTask;
public RelayCommand(Action action)
{
commandTask = action;
}
public override void Execute(object parameter)
{
commandTask();
}
}
}
public class INotifyPropertyChangedBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace WpfTestProject
{
public class CalculatorViewModel : INotifyPropertyChangedBase
{
#region members
string _mathMethod;
double _firstValue;
double _secondValue;
double _result;
#endregion
#region properties
public string MathMethod { get => _mathMethod; set { _mathMethod = value; OnPropertyChanged(nameof(MathMethod)); } }
public double FirstValue { get => _firstValue; set => _firstValue = value; }
public double SecondValue { get => _secondValue; set => _secondValue = value; }
public double ResultValue { get => _result; set { _result = value; OnPropertyChanged(nameof(ResultValue)); } }
#endregion
#region Commands
public ICommand AddCommand
{
get
{
//return plusCommand;
return new RelayCommand(Add);
}
}
public ICommand SubTractCommand
{
get
{
return new RelayCommand(SubTract);
}
}
public ICommand TimesCommand
{
get
{
return new RelayCommand(Times);
}
}
public ICommand PercentCommand
{
get
{
return new RelayCommand(Percent);
}
}
public ICommand DivideCommand
{
get
{
return new RelayCommand(Divide);
}
}
#endregion
#region Methods
public void Add()
{
MathMethod = "+";
ResultValue = FirstValue + SecondValue;
return;
}
public void SubTract()
{
MathMethod = "-";
ResultValue = FirstValue - SecondValue;
}
public void Times()
{
MathMethod = "*";
ResultValue = FirstValue * SecondValue;
}
public void Divide()
{
MathMethod = "/";
ResultValue = FirstValue / SecondValue;
}
public void Percent()
{
MathMethod = "%";
ResultValue = FirstValue * SecondValue;
}
#endregion
}
}